【问题标题】:Verifying complexity of sorting N integers, M at a time验证一次排序 N 个整数 M 的复杂性
【发布时间】:2014-02-17 13:02:21
【问题描述】:

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

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

但是我们需要对总共 N 个元素进行排序。 因此,我们需要总共排序 N / M 次。 因此

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

因此最终得出

O (N log M)

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

【问题讨论】:

  • 没错。由于您正在处理整数,因此您可以使用更有效的整数排序算法,如基数排序。

标签: algorithm sorting merge time-complexity


【解决方案1】:

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

O(N*Log(N/k))

【讨论】:

    【解决方案2】:

    如果您想最终对所有 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 )。应该是这样的。

    【讨论】:

    • 来自 OP 的引述:“我只询问称为外部排序的更大问题的 第一部分(排序部分)的复杂性”强调我的。您所描述的可能会被视为“合并部分”或其他内容。
    猜你喜欢
    • 2016-04-19
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多