使用Merge排序对n个字符串进行排序

时间:2017-08-27 13:19:48

标签: algorithm sorting time-complexity mergesort

使用合并排序算法将每个长度为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 )。

纠正我的错误。

3 个答案:

答案 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) 大师定理。