【问题标题】:MergeSort - Divide a sequence in 2 sub sequences not equalMergeSort - 将一个序列分成 2 个不相等的子序列
【发布时间】:2014-07-26 17:58:55
【问题描述】:

一个测试题:

数组的划分不规则。 数组将被分成 2 个不相等的子序列:

  • (n/3)第一个子序列
  • (2/3)*n第二个子序列

计算归并排序的成本。

当分工不规律时,我该如何解决/处理此类问题?

mid = (start + last)/3;
mergesort (array , start , mid);
mergesort (array , mid+1 , last); 
fusione (array , start , mid , last); cost =  theta(n) 

【问题讨论】:

  • 应该还是 O(log n)
  • 在正常情况下:我有 1 个序列,每个级别都除以 2。所以如果我去主定理,我意识到合并排序(2 个递归调用)+ fusione 的成本, 成本 Theta (n^e log n) 其中 (e = 1) 所以,我会得到 , Theta (n log n)。但是,如果我转向我的情况,我知道我将序列分成 2,但它们的大小并不相等。将原始序列分成 2 个不相等的大小,导致算法的运行速度比原始版本慢,因为每次得到不同的部分。

标签: algorithm sorting time-complexity mergesort divide-and-conquer


【解决方案1】:

让我们从写出递归关系开始。您会将问题拆分为大小为 n / 3 和 2n / 3 的子数组,然后在合并步骤中仍然进行线性工作以组合它们。这给出了复发

T(0) = 1

T(n) = T(n / 3) + T(2n / 3) + Θ(n)

现在的问题是如何解决递归关系。我将声称这是 Θ(n log n)。为了看到这一点,我们将使用递归树方法证明它是 Ω(n log n) 并且是 O(n log n)。

考虑使用递归树扩展此递归。请注意

  • 顶层做 Θ(n) 工作。
  • 下一层有一个大小为 n / 3 的子调用和一个大小为 2n / 3 的子调用,它们共同完成 Θ(n) 工作。
  • 下面的层有一个大小为 n / 9 的子调用、一个大小为 2n / 9 的子调用、一个大小为 2n / 9 的第二个子调用和一个大小为 4n / 9 的最终子调用。总的来说,它们做 Θ(n ) 工作。

更一般地说,直到 n / 3 个分支死亡为止,树的顶层都做 Θ(n) 工作。在你开始停止递归之前的层数大约是 log3 n,所以完成的工作至少是 Ω(n log n),因为 Θ(log n) 层做 Θ( n) 工作。

您还可以注意到,每层的工作量总是 O(n),因为子问题的大小总是不大于上一层子问题的大小(前几层相等,然后下降随着这些层脱落)。因此,上限将为 O(nL),其中 L 是总层数。最慢的收缩问题在每层收缩 2/3,因此总共会有 O(log n) 层。这给出了 O(n log n) 的上限。

由于工作是 O(n log n) 和 Ω(n log n),因此是 Θ(n log n)。

希望这会有所帮助!

【讨论】:

  • 超级帖子,非常感谢您把它表达得这么好。
  • 非常感谢你向我解释了这一切,它非常有帮助,我想用数学方法证明它,这对我来说有点难,所以我想我们会一起做的。顺便说一句,我画了递归树——前 3 个递归调用。 T(n) = T(n/3) + T(2n/3) + Θ(n) -> ((Θ(n) 将被替换为 c*n)
  • 这里有一个提示:写 T(n) = cn log n + dn + k 并尝试使用归纳法。我会把剩下的留作练习,因为这看起来像是一个家庭作业问题。
【解决方案2】:

正确答案是 - n log3/2 n

因为它是T(n) = T(n/3) + T(2n/3) + Θ(n)方程的结果

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2021-12-24
    • 2014-06-21
    • 2021-10-28
    相关资源
    最近更新 更多