Data structures 为什么是二叉搜索树?

Data structures 为什么是二叉搜索树?,data-structures,binary-tree,binary-search-tree,Data Structures,Binary Tree,Binary Search Tree,我在读二进制搜索树,我在想为什么我们需要BST呢?据我所知,所有这些都可以通过使用简单的排序数组来实现。例如,为了构建具有n个元素的BST,我们需要n*O(logn)时间,即O(nlogn),查找时间为O(logn)。但这件事也可以通过使用数组来实现。我们可以有一个排序数组(需要O(nlogn)time),其中的查找时间也是O(logn),即二进制搜索算法。那么为什么我们需要另一种数据结构呢?BST是否有其他用途/应用使其如此特殊 --Ravi排序插入时间如何?在图形编程中,如果您有扩展对象(即

我在读二进制搜索树,我在想为什么我们需要BST呢?据我所知,所有这些都可以通过使用简单的排序数组来实现。例如,为了构建具有n个元素的BST,我们需要
n*O(logn)
时间,即
O(nlogn)
,查找时间为
O(logn)
。但这件事也可以通过使用数组来实现。我们可以有一个排序数组(需要
O(nlogn)
time),其中的查找时间也是
O(logn)
,即二进制搜索算法。那么为什么我们需要另一种数据结构呢?BST是否有其他用途/应用使其如此特殊


--Ravi

排序插入时间如何?

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


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

如果您谈论的是一次写入,多次读取类型的交互,那么数组非常好。当您开始插入、交换和删除BST时,与阵列相比,BST才真正开始发光。由于它们是基于节点的,而不是基于连续的内存块,因此在保持集合的排序性质的同时,将元素移入集合或移出集合的成本很快


可以这样想:链表和数组之间插入的区别。这是一个过于简单化的问题,但它突出了我上面提到的优势的一个方面。

假设您有一个包含一百万个元素的数组

您希望在位置5处插入图元

因此,在数组的末尾插入,然后进行排序

假设数组已满;这就是O(nlogn),也就是1000000*6=6000000次操作

想象你有一棵平衡的树

这是O(logn),加上一个平衡位=6+一个位,称之为10次操作

所以,您刚刚花了6000000次运算来排序阵列。然后,您需要找到该元素。你是做什么的?二进制搜索-O(logn)-这与在树中搜索时要执行的操作完全相同

现在假设您想要分配另一个元素

你的阵型满了!你是做什么的?用n个额外的元素重新分配阵列,并按批次存储?你真的想记忆4MB吗


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

从阵列版本插入/删除的效率是多少?如果它涉及移动阵列的所有其他元素,那么成本可能会很高。好的。。。找到新/现有元素的正确位置仍然是O(对数n),但移动将是一个问题。。。但就这一个。。。。根据我读到的文本,它们(BST)似乎很特别?我想知道更多关于使它们如此特别的事情。很抱歉,我投票以一个新的问题结束,但它的措辞更好,也得到了更多的关注。好的。。。找到新元素的正确位置仍然是O(对数n),但移位将是一个问题。。。但就这一个。。。。根据我读到的文本,它们(BST)似乎很特别?我想知道更多让它们如此特别的东西。我想其他答案可能会对你有所帮助。另一件需要记住的事情是,BST不是最终的数据结构,而是更复杂、更高效结构的基础,这解释了它们的流行。例如,您可能知道在最坏的情况下搜索BST是线性的;这个问题的答案是AVL树。还有红黑树、2-3-4-tree、后缀/前缀树和dawg等等,它们都以不同的方式概括了bst,并产生了我们无法用数组实现的高效算法。