【问题标题】:why do we plug i as log(n-1) in merge sort algorithm为什么我们在归并排序算法中插入 i 作为 log(n-1)
【发布时间】:2014-07-04 14:39:25
【问题描述】:

我对归并排序算法的数学证明有疑问。我只看到证明是数学的,但问题与算法有关。

最坏情况下归并排序的时间复杂度,T(n) = 2T(n/2) + n-1

=> T(n) = n-1 + 2T(n/2) // 递归部分总是放在最后以保持简单

即插即插法:

T(n) = n-1 + 2[n/2-1 + 2T(n/4) ]    //plug
     = n-1 + n-2 + 4T(n/4)          //chug
     = n-1 + n-2 + 4[n/4 -1 + 2T(n/8)]    //plug 
     = n-1 + n-2 + n-3 + ....... + n- 2^i-1 + 2^i T(n/2^i) //rounding off

现在我对这一步有疑问,他为什么将 i 作为 log(n-1)?这给了我们一个答案:

     =nlogn -n+1

【问题讨论】:

  • 你认为i应该是什么?
  • @PatriciaShanahan 我认为应该只是 n :(

标签: algorithm mergesort


【解决方案1】:

随着问题n 的大小减少,每次减半,n 变成可以在恒定时间内解决的基本情况问题的大小。 在这种情况下,n=1 是基本情况,因为已知T(1) 是有序的O(1)

在您的扩展中,数字in 减半的次数。

现在的问题是:当n 在递归停止处变为1 时,此时i 的值是多少?

n可以被2除多少次才变成1?

答案是log_2(n)

所以“即插即用”扩展在值 i = log_2(n) 处停止

【讨论】:

  • 我得到了你的答案 i=log(n)[_2 表示基数 2 对吗?] 但他在这里使用了 log(n-1) :(
  • 是的,这意味着日志基数为 2。但是当你计算 'Big O' bound 时,可以忽略 log 的底数,因为不同底数的 log 可以通过常数乘法相互转换。
  • 关于另一个问题 i 被用作 log(n-1) 在这里是否意味着我必须将 n 划分为 log(n-1) 倍直到它变为 1?
  • 这并不是真正关于 n 变成 1。而是关于 n 变成你确切知道算法需要多长时间才能解决的大小。在归并排序的情况下,我们知道对 1 个项目进行排序所需的时间是恒定的。也就是说,您可以将T(1) 替换为O(1)。在其他问题中,您可能知道T(2)O(1)。在另一种情况下,您希望使用n = 2 停止扩展。这可能意味着 n 减半 log_2(n-1) 次。
  • *对不起,我在最后的陈述中犯了一个错误。 n 减半 log_2(n)-1 次给出 2。不是 log_2(n-1) 次。 ....log_2(n-1) 是将n-1 除以二得到1 所需的次数。
猜你喜欢
  • 2022-11-27
  • 2016-01-20
  • 2011-12-09
  • 2018-11-10
  • 2019-11-12
  • 2014-08-02
  • 2021-01-02
  • 1970-01-01
  • 2014-10-26
相关资源
最近更新 更多