Algorithm 合并排序的时间复杂性
为什么自顶向下合并排序的最佳情况的时间复杂度为O(nlogn)? 我认为自顶向下合并排序的最佳情况是1,只需要比较1次。 在最坏情况、最佳情况和平均情况下,自底向上合并排序的时间复杂度如何 还有一个问题是,为什么每次迭代都需要精确的O(n)?有人能帮忙吗 为什么自顶向下合并排序的最佳情况的时间复杂度是 O(nlogn) 因为在每次迭代中,您将数组拆分为两个子列表,并递归地调用算法。在最好的情况下,您可以将它精确地拆分为一半,从而将(每个递归调用的)问题减少到原始问题的一半。您需要日志2(n)次迭代,每次迭代都精确地执行Algorithm 合并排序的时间复杂性,algorithm,merge,Algorithm,Merge,为什么自顶向下合并排序的最佳情况的时间复杂度为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)),谢谢!明白了,最坏的情况如何?摘自《算法的设计与分析》。为什么最坏的情况是两个数组都不为空,而另一个数组只包含一个元素?不是把输入分成两半吗?