我只是要求复杂性的第一部分(排序部分)更复杂的问题称为外部排序。 N - 整数个数(适合内存的大数) M - 可以使用合并排序在内存中排序的整数数。
合并排序的复杂性: O(M log M)
但我们需要对N个元素进行排序。 因此,我们需要完全按N / M次排序。 从而
O((N / M)* M log M)
因此最终得出
O(N log M)
这是正确的复杂性吗?如果没有改正我的计算。
答案 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)。正如它应该的那样。