Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 二叉树什么时候比有序列表好?_Algorithm_Binary Tree_Sortedlist - Fatal编程技术网

Algorithm 二叉树什么时候比有序列表好?

Algorithm 二叉树什么时候比有序列表好?,algorithm,binary-tree,sortedlist,Algorithm,Binary Tree,Sortedlist,我理解它们之间的区别,但我找不到二叉树更好的情况。搜索、插入等成本大致相同。还是我错了?平衡二叉树有Insert/Search/Update/DeleteO(logN),有序列表有Insert/Serach/Upade/DeleteO(N)。区别在于你的N与相应的常数相比有多大。是的,你错了。搜索需要在有序(链接)列表中执行O(n)(因为你需要遍历整个链接列表以找到正确的元素),而在(自平衡)二叉(搜索)树(BST)中执行O(logn)(因为,在每个节点上,可以向左或向右看,有效地将输入分成大约

我理解它们之间的区别,但我找不到二叉树更好的情况。搜索、插入等成本大致相同。还是我错了?

平衡二叉树有Insert/Search/Update/Delete
O(logN)
,有序列表有Insert/Serach/Upade/Delete
O(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)
通过索引获取元素)。如果您谈论的是数组,我将更新我的答案。