使用合并排序算法将每个长度为n的n个字符串列表排序为字典顺序。最坏的情况是这个计算的运行时间是?
我搜索了这个问题,到处都找到了答案:O(n 2 logn)。
虽然我的方法如下:
比较两个字符串需要进行O(n)比较,因此每个合并将花费O(n 2 )时间。
因此,递推方程将是:
T(n)= 2T(n / 2)+ O(n 2 )
因此,通过Master方法:
T(n)= O(n 2 )。
纠正我的错误。
答案 0 :(得分:1)
我认为你对O(n^2*lgn)
的结论是正确的。如果您正在处理一组n
个数字,我们知道mergesort需要O(nlgn)
。这里的不同之处在于我们现在正在处理字符串,每个字符串都是n
长。对mergesort算法的唯一影响是在基本情况下比较两个字符串。而不是O(1)
两个数字的比较,我们将不得不比较两个字符串。在一般情况下,这是一个O(n)
操作,因为我们可能需要遍历两个长度n
字符串中的每一个。
答案 1 :(得分:1)
您的分析和减少是正确的。但问题在于对主定理的递推方程的解释。
T(n)= 2T(n / 2)+ O(n 2 )
等式中的n表示要排序的列表中的元素数。 O(n 2 )并不完全正确。它是O(n * n字符比较)。 如果我们用'n字符比较'代替'这将是显而易见的。具有不同复杂性的操作,其独立于任何元素。 设为O(m)。 然后我们有
T(n)= 2T(n / 2)+ O(n * m)
我们有a = 2,b = 2,c = 1和c = Log b a(案例2)
因此, T(n)= O(n * m * log n)
现在,用m替换m
T(n)= O(n 2 * log n)
我们也可以证明这一点 - 合并排序的重复树将具有高度Log(n)。 O(n 2 )工作将在合并操作中的重复树的每个级别完成。
因此,总共 O(n 2 log n)
希望它有所帮助!
答案 2 :(得分:0)
arunk2 的回答是正确的,但这里有一些关于重复出现问题的确切位置的更多详细信息:
在正常的归并排序数字中,循环是: T(n) = 2T(n/2) + cn ;其中 c 是某个常数
注意在求解此递归时会发生什么,以及用 c(n^2) 求解递归 T'(n) 时的差异
T(n) = 2T(n/2) + cn
T(n) = 2[2T(n/(2^2)) + c(n/2)] + cn
T(n) = (2^2)T(n/(2^2)) + cn + cn //在logn步之后,'cn'会被添加logn次,因此得到O( nlogn)
T'(n) = 2T(n/2) + c(n^2)
T'(n) = 2[2T(n/(2^2)) + c((n/2)^2)] + c(n^2)
T'(n) = (2^2)T(n/(2^2)) + c(n^2)/2 + c(n^2) //每次n^2减半,结果为 O(n^2)
如果仔细分析算法,(正如在 arun 的回答中提到的那样),每个级别完成的工作始终是 n^2,并且不会在每个级别减半,这就是时间复杂度为 O( (n^2)logn) 而不是简单的 O(n^2) 大师定理。