【问题标题】:Merge sort complexity合并排序复杂度
【发布时间】:2013-10-21 20:46:48
【问题描述】:

我们知道合并排序对于以下算法的时间复杂度为 O(nlogn):

void mergesort(n elements) {
mergesort(left half);  ------------ (1)
mergesort(right half); ------------(2)
merge(left half, right half);

以下实现的时间复杂度是多少?

(1)
void mergesort(n elements) {
    mergesort(first quarter);  ------------ (1)
    mergesort(remaining three quarters); ------------(2)
    merge(first quarter, remaining three quarters);

(2)
void mergesort(n elements) {
    mergesort(first quarter);  ------------ (1)
    mergesort(second quarter); ------------(2)
    mergesort(third quarter);  ------------ (3)
    mergesort(fourth quarter); ------------(4)
    merge(first quarter, second quarter,third quarter, fourth quarter);

请详细说明您是如何找到复杂性的。

【问题讨论】:

  • 这似乎是一道作业题。没问题,但至少解释一下你的想法。我们不是在这里给你一个准备好复制粘贴的答案。
  • 我有一个 smilar ,和作业不一样的问题。我计算了递归关系,每次都得到nlogn的答案。觉得很奇怪。

标签: algorithm sorting merge time-complexity


【解决方案1】:

请注意,这不是您问题的确切答案,而是一个提示。

首先我们需要了解默认归并排序的时间复杂度是 n(log n)。

如果我们有 8 个元素并且默认情况下合并排序方法,如果我们每次将它们分成两半直到我们到达仅包含一个元素的组,这将需要我们 3 步。

所以这意味着mergesort在N个元素上被调用了3次。这就是为什么时间复杂度是 3*8 即 (log N)*N

如果您将默认分区从一半更改为其他比例,您必须计算达到 1 个元素的组需要多少步。

另请注意,此答案仅旨在解释如何计算复杂性。所有分区方法的大 O 复杂度都是相同的,如果以有效的方式实现,即使其他 2 个分区也将具有 N(logN) 的精确复杂度

【讨论】:

  • 但是合并步骤的复杂度不会增加吗?因此,随着间隔数量的增加,整体复杂性也会增加。
【解决方案2】:

仍然是 O (n log n),因为 n 的 log base 4 = log n / log 4,最终是一个常数。

[编辑]

合并排序算法与k分裂的递归关系如下。我假设将 k 个排序后的数组与总共 n 个元素合并花费 n log2(k),log2 表示 log base 2。

T(1) = 0
T(n) = n log2(k) + k T(n/k)

我可以解决递归关系:

T(n) = n log2(n)

不管k的值是多少。

【讨论】:

  • 那么,一旦我们增加编号,关系会是什么样子。间隔?我看到的是分母增加,时间复杂度降低?
  • 对于 2 个区间,我们有 T(n) = T(n/2) + T(n/2) + n。该关系将如何寻找 4 个区间? T(n) = 4T(n/4) + 什么?就 n 而言,合并步骤的复杂性是多少?
  • 它会更快 log 4 / log 2 的常数因子,但仍然是 O(n log n)
  • 我不认为它会更快。合并步骤实际上会更慢,从而增加整体复杂性。
  • 我没有安静地了解复杂性和性能之间的区别。你能解释一下这个案例吗?
【解决方案3】:

您发布的所有三种算法都是 O(n log n),只是常数略有不同。

基本思想是它需要 log(n) 遍,并且在每遍中检查 n 项。不管你的分区有多大,事实上你可以有不同大小的分区。它的结果总是 O(n log n)。

运行时差异将在merge 方法中。合并排序列表是一个 O(n log k) 操作,其中 n 是要合并的项目的总数,k 是列表的数量。所以合并两个列表是n * log(2),结果是n(因为log2(2) == 1)。

请参阅我对How to sort K sorted arrays, with MERGE SORT 的回复了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    相关资源
    最近更新 更多