Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Merge - Fatal编程技术网

Algorithm 合并排序的时间复杂性

Algorithm 合并排序的时间复杂性,algorithm,merge,Algorithm,Merge,为什么自顶向下合并排序的最佳情况的时间复杂度为O(nlogn)? 我认为自顶向下合并排序的最佳情况是1,只需要比较1次。 在最坏情况、最佳情况和平均情况下,自底向上合并排序的时间复杂度如何 还有一个问题是,为什么每次迭代都需要精确的O(n)?有人能帮忙吗 为什么自顶向下合并排序的最佳情况的时间复杂度是 O(nlogn) 因为在每次迭代中,您将数组拆分为两个子列表,并递归地调用算法。在最好的情况下,您可以将它精确地拆分为一半,从而将(每个递归调用的)问题减少到原始问题的一半。您需要日志2(n)次迭

为什么自顶向下合并排序的最佳情况的时间复杂度为O(nlogn)? 我认为自顶向下合并排序的最佳情况是1,只需要比较1次。 在最坏情况、最佳情况和平均情况下,自底向上合并排序的时间复杂度如何

还有一个问题是,为什么每次迭代都需要精确的O(n)?有人能帮忙吗

为什么自顶向下合并排序的最佳情况的时间复杂度是 O(nlogn)

因为在每次迭代中,您将数组拆分为两个子列表,并递归地调用算法。在最好的情况下,您可以将它精确地拆分为一半,从而将(每个递归调用的)问题减少到原始问题的一半。您需要日志2(n)次迭代,每次迭代都精确地执行
O(n)
(每次迭代都在所有子列表上,总大小仍然是
n
),因此在总
O(nlogn)

但是,通过一个简单的预处理来检查列表是否已经排序,它可以减少到
O(n)

由于检查列表是否已排序本身就是
O(n)
-因此无法在
O(1)
中完成。请注意,“最佳情况”是一般
n
的“最佳情况”,而不是特定的大小

在最坏的情况下,自下而上合并排序的时间复杂度如何, 最佳案例和一般案例


同样的方法可以为您提供O(n)最佳情况下的自底向上(简单的预处理)。自底向上合并排序的最坏情况和最佳情况是
O(nlogn)
——因为在这种方法中,列表总是被分成两个长度相等(最多相差1)的列表。

O(1)
?通过预处理和检查数组是否已排序,可能是
O(n)
。“最佳情况”是指“输入大小为
n
”的最佳情况,而不是“假设只有两个项要排序的最佳情况”。请描述您认为是O(1)的算法我们可能会告诉你哪里是错的…@Chris,除非算法被证明是某种桶排序,否则没有“可能”:)对于你可能想要的所有信息(谷歌会为你做的令人惊讶)。为什么迭代应该是log_2(n)?这有什么公式吗?还有一个关于二叉树的问题,为什么二叉树的长度是log(n)。@Justin:在递归的最深处,你有1个元素。第二级你有2个。第三级是4级,第四级是8级。。。。在第i级,有2^(i-1)个元素。所以我们正在寻找
i
,这样
2^(i-1)=n
。由于
2^logn==n
,我们得出结论
i=logn+1
-因此,总迭代次数是
O(logn)
对于二进制树也是一样的。您所说的1个元素,2个元素是什么意思?你的意思是,首先,有一个数组列表,其次,它被分为两部分,依此类推。@Justin:这就是合并排序的工作方式,在最深层(stop子句)你有一个元素。在它之前的级别上有两个元素。。。递归的每一级都在处理原始的某个子列表,这个子列表的长度与我描述的相同(1,2,4,…2^(I-1)),谢谢!明白了,最坏的情况如何?摘自《算法的设计与分析》。为什么最坏的情况是两个数组都不为空,而另一个数组只包含一个元素?不是把输入分成两半吗?