我理解它们之间的差异,但是当二叉树更好时我找不到任何情况。搜索,插入等成本或多或少相同。或者我错了吗?
答案 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)
,看看我们得到了什么。对于n
,n = 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)。