二叉树何时优于有序列表?

时间:2013-12-02 13:56:35

标签: algorithm binary-tree sortedlist

我理解它们之间的差异,但是当二叉树更好时我找不到任何情况。搜索,插入等成本或多或少相同。或者我错了吗?

2 个答案:

答案 0 :(得分:2)

平衡二叉树具有插入/搜索/更新/删除O(logN),有序列表具有插入/搜索/ Upade /删除O(N)。不同之处在于你的N与相应的常数相比有多大。是的,你错了。

答案 1 :(得分:1)

搜索会在有序(链接)列表中获取O(n)(因为您需要遍历整个链接列表以找到正确的元素),而需要{{1在(自平衡)二进制(搜索)树(BST)中(因为,在每个节点,您可以向左或向右看,有效地将输入分成大约一半)。

虽然插入和删除理论上可以在链接列表中的O(log n)中执行,但您需要搜索正确的位置以插入或找到要首先删除的元素,因此这些操作也需要O(1),而不是BST,他们会O(n)。{/ p>

O(log n)O(n)之间有什么区别?

好吧,我们可以用一两个值替换O(log n),看看我们得到了什么。对于nn = 1 000 000。由此可见,log n = 19.93 小于log n并不太难。因此,除非常小的数据集,n优先于O(log n)

技术说明:

“list”可能含糊不清 - 它主要用于引用链表,但在某些情况下,它用于引用数组。我假设链表。对于数组,分析有些不同,但我们仍然可以获得插入和删除O(n)。

它必须是二进制搜索树,否则我们真的在比较苹果和橙子 - 普通二叉树是无序数据结构。 BST还需要自我平衡,否则你可以获得一个非常不平衡的树(在最坏的情况下,使它看起来像一个链表),导致O(n)操作。

我没有提及更新,因为它可以实现为删除,后跟插入

那么,有序的链表是否有用?

它肯定用途有限,但在某些情况下确实优于BST。

考虑一下你是否主要将列表用作队列或堆栈(主要是从前面或后面移除或插入O(n)操作,其中 - 这些操作是O(1)在BST)。