【问题标题】:Big Oh Complexity of Merge Sort归并排序的大 O 复杂度
【发布时间】:2017-04-11 02:01:43
【问题描述】:

我有一个关于 Big Oh for Merge Sort 的讲座,我很困惑。

显示的是:

0 合并 [] = n

1 合并 [] = (n/2 + n/2) = n

2 合并 [n/4][n/4][n/4][n/4] = 2(n/4 + n/4) = n

....

log(n) 合并 = n

总计 = (n + n + n + ... + n) = lg n = O(n log n)

我不明白为什么 (n + n + ... + n) 也可以表示为 n 的以 2 为底的对数,以及它们如何得到 2 次合并 = 2(n/4 + n/4)

【问题讨论】:

  • 他们告诉我们,显然它也可以写成 Big-Oh :o
  • 好吧,没见过

标签: algorithm sorting time-complexity big-o


【解决方案1】:

在 1 次合并的情况下,您有两个要排序的子数组,其中每个子数组的排序时间与 n/2 成正比。从这个意义上说,要对这两个子数组进行排序,您需要一个与 n 成比例的时间。

同样,当您进行 2 次合并时,有 4 个子数组需要排序,每个子数组所花费的时间与 n/4 成正比,总和为 n。

同样,如果您有 n 次合并,则将花费与 n 成比例的时间来对所有子数组进行排序。从这个意义上说,我们可以将归并排序所花费的时间写成如下。

T(n) = 2 * T(n/2) + n

你会明白这个递归调用可以深入(比如说到 h 的高度)直到n/(2^h) = 1。通过在这里记录日志,我们得到 h=log(n)。这就是 log(n) 出现的方式。这里的 log 取自 base 2。

由于您有 log(n) 个步骤,其中每个步骤花费的时间与 n 成正比,因此所花费的总时间可以表示为,

n * log(n)

在大 O 符号中,我们将其作为上限 O(nlog(n))。希望你明白了。

以下递归树的图像将进一步启发您。

【讨论】:

  • 您是否以某种方式生成了树,或者您找到了它?我很好奇。
  • @synchronizer:是常用的图片。我曾经在我自己的answers 中使用过它。
【解决方案2】:

以下部分的最后一行写在你的问题中,

0 合并 [] = n

1 合并 [] = (n/2 + n/2) = n

2 合并 [n/4][n/4][n/4][n/4] = 2(n/4 + n/4) = n

....

n merges = n --此行不正确!

错了。您不会有总共 n 次大小为 n 的合并,而是 Log n 次大小为 n 的合并。

在每个级别,您将问题大小分成 2 个大小一半的问题。当你继续潜水时,你可以做的总分是 Log n。 (如何?假设可能的总划分为 x。那么 n = 2x 或 x = Log2n。)

由于在每个级别上您总共做了 O(n) 的工作,因此对于 Log n 级别,完成的所有工作的总和将是 O(n Log n)。

【讨论】:

    【解决方案3】:

    树的深度为 log(n),宽度为 n。 :)

    【讨论】:

    • log(n) 的深度是多少?
    • 抱歉这个令人困惑的答案。 @Imesha Sudasingha 带来了一张关于深度和宽度的可爱图表。
    【解决方案4】:

    日志部分是“在我只剩下一个元素之前,我可以将数据分成多少次?”的结果。这是递归树的深度。 n 的倍数来自这样一个事实,即对于树中的每个级别,您将在该级别的所有合并步骤之后查看数据集中的每个元素。

    recurse downwards:
        n unsorted elements
      [n/2][n/2] split until singletons...
      ...
    merge n elements at each step when recursing back up
      [][][]...[][][]
      [ ] ... [ ]
      ...
      [n/2][n/2]
      n sorted elements
    

    【讨论】:

    • log base 2 of n 是拆分数据集直到只剩下单例所需的次数。每个级别都有“n”个,因为在特定级别的所有合并步骤中,您最终会遍历每个子数组的整体。我承认,Imssha 的回答更具体。希望我能帮上一点忙。
    【解决方案5】:

    这很简单。正如您所演示的,每个合并都需要 O(n) 。您需要进行的合并次数是 log n(以 2 为底),因为每次合并都会使已排序部分的大小加倍。

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 2017-04-03
      • 2023-01-18
      • 2021-05-07
      • 2020-01-07
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多