Data structures 不同数据结构的大O运行时间

Data structures 不同数据结构的大O运行时间,data-structures,big-o,time-complexity,Data Structures,Big O,Time Complexity,我试图找出以下数据结构的大O运行时间。 他们说得对吗 将n个整数插入初始为空的AVL树(最佳情况) O(对数n) 将n个整数插入初始为空的AVL树(最坏情况) O(对数n) 将n个整数插入到初始为空的二元搜索树中,该二元搜索树不强制 结构属性(最佳情况) O(对数n) 将n个整数插入到初始为空的二元搜索树中,该二元搜索树不强制 结构特性(最坏情况) O(n) 另外,解释它们不正确的原因也会有帮助是的,如果你用n乘以所有的值,你是正确的。您的运行时间只针对一个元素。这在您的定义中是不正确的:

我试图找出以下数据结构的大O运行时间。 他们说得对吗

  • 将n个整数插入初始为空的AVL树(最佳情况) O(对数n)

  • 将n个整数插入初始为空的AVL树(最坏情况) O(对数n)

  • 将n个整数插入到初始为空的二元搜索树中,该二元搜索树不强制 结构属性(最佳情况) O(对数n)

  • 将n个整数插入到初始为空的二元搜索树中,该二元搜索树不强制 结构特性(最坏情况) O(n)


另外,解释它们不正确的原因也会有帮助

是的,如果你用n乘以所有的值,你是正确的。您的运行时间只针对一个元素。

这在您的定义中是不正确的:

将n个整数插入初始为空的AVL树(最佳情况)O(logn)

您不能在少于
n
的操作中访问(和复制)
n
数据项,因为您应该读取每个项(因此,
O(n)
是在n个元素上移动的最小值)

因此,我的假设是,对于单个元素,您给出了正确的
O()
(这有点错误,因为在特殊输入上可以获得最佳结果;您的估计是平均情况,而不是最佳情况),因此,对于所描述的总操作,我将用
O(n)
乘以每个:

  • 将n个整数插入最初为空的AVL树(最佳情况)
    O(n*logn)
    UPDATE:这是平均值;对于特殊输入,最佳时间可以更低

  • 将n个整数插入最初为空的AVL树(最坏情况)
    O(n*logn)

  • 将n个整数插入初始为空的二元搜索树,该二元搜索树不强制执行结构属性(最佳情况)
    O(n*log n)
    更新:这可能取决于实现和整数序列;所以最好的情况是
    O(n)
    (参见注释)

  • 将n个整数插入到初始为空的二叉搜索树中,该二叉搜索树不强制执行结构属性(最坏情况)
    O(n*n)


插入
n
整数如何导致
O(logn)
的大O。那没有任何意义。当然读取整数本身至少需要
O(n)

因此,对于不平衡的BST示例,最坏的情况是插入排序的数字列表,如
1,2,3,4
。插入1需要0时间。插入2需要
~1
时间。插入3需要
~2
时间。这相当于
1+2+3+…+n=O(n^2)

类似地,在最佳情况下,每个后续插入都需要
log(i)
时间。因此,总运行时间是
log(1)+log(2)+log(3)+…+log(n)
。这一评估结果并不明显。但如果你懂一点微积分,你会发现这是(几乎)对数n从1到n的积分的梯形规则近似。这大约是
nlogn-n=O(nlogn)


我相信您可以对AVL树进行类似的分析。

对不起,它们都错了

您使用的是用于单次插入的大型操作系统。如果你不知道其中的n个,你就得用n次

因此,正确的数字是:

将n个整数插入:

  • AVL树(最坏情况):O(log(n)*n)
  • AVL树(最佳情况):这很难,但我猜也是O(log(n)*n)
  • 不强制结构属性的二进制搜索树(最佳情况): O(n)-一个项目的最佳案例插入时间实际上是O(1)
  • 不强制结构属性的二进制搜索树(最坏情况): O(n^2)-如果不强制执行结构属性,可能会导致树完全不平衡,因此在最坏的情况下,由n个元素组成的树的高度为n=>树将变形为列表

我假设您需要插入所有元素的总时间:

(1) 在AVL树的最佳情况下,,您永远不需要到根的下方,[即所有元素都等于根],因此它将是O(n)。[无论树的大小,都不需要加深超过1步]。O(1)个元素

(2) AVL树的最坏情况:向AVL树插入n个整数是O(nlogn)。每个步骤都是O(log(T)),其中T是此时的大小<代码>O(log1)+O(log2)+…+O(logn)=O(log1+log2+…+logn)=O(log1*…*n))=O(nlogn)。所以O(nlogn)。O(logn)每个元素

(3) 在没有结构强制的情况下,最佳情况仍然是O(n)
,原因与(1)相同。在最好的情况下,您添加的所有元素都是根元素,因此无论树的大小如何,您都不需要进入树中。O(1)个元素


(4) 在没有结构强制的情况下,最坏的情况是:正如在其他答案中所说的,为每个元素查找位置是O(n),因此总体而言,最坏的时间复杂度是O(n^2)。O(n)每个元素。

为什么这个标记为C?所有语言的复杂性都是一样的吗?你是说插入每个元素需要多少时间?还是全部?插入n个元素总是ω(n)。@cnicutar:严格来说,复杂性取决于基本操作的复杂性。C中的基本操作与Haskell或Prolog中的基本操作不同。不过,在这种情况下这并不重要。@amit这不一定是真的。使用分布式计算和共享内存,在插入单个元素的同时插入n个元素是完全可行的。虽然它可能不一定适用于这种情况,但需要注意的是。@glowcoder:time complexity指的是所需的操作数,n