为什么二元搜索树?

时间:2010-10-14 15:28:39

标签: data-structures binary-tree binary-search-tree

我正在阅读二元搜索树,并且在想我们为什么需要BST呢?据我所知,所有的事情也可以使用简单的排序数组来实现。对于例如 - 为了构建具有n个元素的BST,我们需要n*O(log n)时间,即O(nlog n),查找时间为O(log n)。但是这个东西也可以用数组来实现。我们可以有一个排序数组(需要O(nlog n)时间),查询时间也是O(log n),即二进制搜索算法。那为什么我们需要另一个数据结构呢? BST还有其他任何使用/应用使它们如此特别吗?

- 拉维

4 个答案:

答案 0 :(得分:10)

如果您正在谈论一次写入,多次阅读类型的交互,那么数组很棒。当你开始插入,交换和删除时,BST真正开始闪耀,而不是阵列。由于它们是基于节点的,而不是基于连续的内存块,因此将元素移入集合或集合中的成本很快,同时仍保持集合的排序性质。

将其视为链接列表与数组之间插入的差异。这是过于简单化,但它突出了我上面提到的优势的一个方面。

答案 1 :(得分:7)

想象一下,你有一个拥有一百万个元素的数组。

您想在位置5处插入元素。

所以你插入数组的末尾然后排序。

假设阵列已满;这是O(nlog n),即1,000,000 * 6 = 6,000,000次操作。

想象一下,你有一棵平衡的树。

那是O(log n),加上一点平衡= 6 +一点,称之为10次操作。

所以,你刚刚花了6,000,000个操作来排序你的数组。然后,您想要找到该元素。你是做什么?二进制搜索 - O(log n) - 完全与您在树中搜索时要执行的操作完全相同!

现在想象你想要分配-another- element。

你的阵列已满!你是做什么?用n个额外的元素重新分配数组并memcpy该批次?你真的想记住4mbytes吗?

在树中,您只需添加另一个元素......

答案 2 :(得分:4)

排序插入时间怎么样?

答案 3 :(得分:1)

在图形编程中,如果您有扩展对象(即表示每个维度中的间隔而不仅仅是一个点),您可以将它们添加到完全适合的二叉树(通常是八叉树)的最小级别。 / p>

如果你不预先计算树/有序列表,列表中的O(n)随机插入时间可能会非常慢。另一方面,树中的插入时间仅为O(log(n))。