Algorithm 二叉树什么时候比有序列表好?
我理解它们之间的区别,但我找不到二叉树更好的情况。搜索、插入等成本大致相同。还是我错了?平衡二叉树有Insert/Search/Update/DeleteAlgorithm 二叉树什么时候比有序列表好?,algorithm,binary-tree,sortedlist,Algorithm,Binary Tree,Sortedlist,我理解它们之间的区别,但我找不到二叉树更好的情况。搜索、插入等成本大致相同。还是我错了?平衡二叉树有Insert/Search/Update/DeleteO(logN),有序列表有Insert/Serach/Upade/DeleteO(N)。区别在于你的N与相应的常数相比有多大。是的,你错了。搜索需要在有序(链接)列表中执行O(n)(因为你需要遍历整个链接列表以找到正确的元素),而在(自平衡)二叉(搜索)树(BST)中执行O(logn)(因为,在每个节点上,可以向左或向右看,有效地将输入分成大约
O(logN)
,有序列表有Insert/Serach/Upade/DeleteO(N)
。区别在于你的N
与相应的常数相比有多大。是的,你错了。搜索需要在有序(链接)列表中执行O(n)
(因为你需要遍历整个链接列表以找到正确的元素),而在(自平衡)二叉(搜索)树(BST)中执行O(logn)
(因为,在每个节点上,可以向左或向右看,有效地将输入分成大约一半)
虽然理论上可以在链表中的O(1)
中执行插入和删除,但您需要搜索正确的位置以首先插入或查找要删除的元素,因此这些操作也将采用O(n)
,而不是采用O(log n)
的BST
O(n)和O(logn)
之间有什么区别?
好的,我们可以用一个或两个值代替n
,看看我们得到了什么。对于n=1000000
,logn=19.93
。由此不难看出logn
比n
小得多。因此,除了非常小的数据集之外,O(logn)
比O(n)更受欢迎
技术说明:
“列表”可能不明确-它主要用于指链接列表,但在某些情况下,它用于指数组。我假设是链接列表。对于数组,分析有些不同,但插入和删除仍然得到O(n)
它需要是一个二叉搜索树,否则我们实际上是在比较苹果和橙子——一个普通的二叉树是一个无序的数据结构。BST也需要自我平衡,否则你会得到一个非常不平衡的树(在最坏的情况下,使它看起来像一个链表),导致O(n)
操作
我没有提到更新,因为它可以实现为先删除后插入
那么,有序链表有用吗?
它的用途肯定是有限的,但在某些情况下,它的性能确实优于BST
考虑您是否主要将列表用作队列或堆栈(您主要从前面或后面移除或插入,这是
O(1)
操作,其中这些操作在BST中是O(log n)
).为什么空气比水好?搜索1024个项目的列表需要1023个比较,搜索1024个项目的二叉树需要9个比较。嗯,如果对有序列表使用二进制搜索,它也会生成O(logN)。与插入/更新/删除相同,不是吗?如何在O(logN)中搜索有序列表?@hipolith你不能在链表上进行二进制搜索。好吧,愚蠢的我:D非常感谢guysHm,如果我在有序列表上使用二进制搜索,它也会生成O(logN)。与插入/更新/删除相同,不是吗?给我显示有序列表的二进制搜索算法。@hipolith“list”这里可能有点模棱两可-它主要用来指一个链表,但在某些情况下,它用来指一个数组。这就是为什么我把“(linked-”放在括号中。如果它是一个链表,你不能对它进行(O(logn)
)二进制搜索,因为你没有固定时间的随机访问(你使用O(n)
通过索引获取元素)。如果您谈论的是数组,我将更新我的答案。