验证排序N个整数的复杂性,一次M个

时间:2014-01-26 19:31:47

标签: algorithm sorting merge time-complexity

我只是要求复杂性的第一部分(排序部分)更复杂的问题称为外部排序。 N - 整数个数(适合内存的大数) M - 可以使用合并排序在内存中排序的整数数。

合并排序的复杂性: O(M log M)

但我们需要对N个元素进行排序。 因此,我们需要完全按N / M次排序。 从而

O((N / M)* M log M)

因此最终得出

O(N log M)

这是正确的复杂性吗?如果没有改正我的计算。

2 个答案:

答案 0 :(得分:1)

是的,这是一次排序N个整数M的第一阶段的正确复杂性。如果你说M大小的集合的数量是k,你可以用不同的方式表达相同的数字。然后你可以说它是

O(N*Log(N/k))

答案 1 :(得分:0)

如果您希望最终排序所有N个元素,那么这是不够的。您将N个数字的总集合分成M个数字的N / M子集。然后对每个子集进行排序。正如你所知道的那样,这有一个O(N log M)的复杂性,如果你的目标是最终得到几个已排序的子集你就完成了,一切都很好。但是,此时你没有整个N排序,你只需要几个已排序的子集,还有一些工作要做。仍然缺少的是将这些子集合并在一起的操作。假设您的合并操作始终将两个子集合并为一个,您仍然需要执行Log2(N / M)合并操作,每个操作都具有复杂度O(N)。因此最终的复杂度是O(N log M + N Log(N / M))= O(N Log N)。正如它应该的那样。