【问题标题】:Max-heapify with convergent series具有收敛级数的 Max-heapify
【发布时间】:2020-03-20 04:03:36
【问题描述】:

我正在经历 max-heapify,下面是观察结果

1- 观察 max-heapify 对于比叶子高一级的节点需要 O(1) 时间,对于比叶子高 L 级的节点通常需要 O(L) 时间

2- n/4 个节点,级别 1,n/8 个节点,级别 2,依此类推。

for循环的总工作量:

n/4 (1 c) + n/8 (2 c) + n/16 (3c) + ... + 1(log n c)

设置 n/4 = 2 pow k

C*2powk (1/2pow0 + 2/2pow1 + 3/2pow2 + ... + (k+1)/2powk)

括号中的数列是由一个常数限制的收敛数列

算法是:

构建最大堆 (A)

for i=n/2 down to 1:
  do max-heapify (A,i)

我从讲座中了解了大部分内容,但我在某些方面感到困惑

1- 为什么我们使用 n/4 (1 c),为什么不使用 n/2?以及我们如何知道 n/4 将我们引导至 1 级

2- 这个收敛级数如何将我们引向 theta n 复杂度

【问题讨论】:

  • stackoverflow.com/a/49781979/56778 有什么帮助吗?
  • 是的,它帮了很多忙,你能帮我解决这个问题吗(7 3 2*1 + 1*2 = 4),堆大小为 7,级别 3,如何计算电影 2* 1+1*2?是子孙的根吗?
  • 一个有七个节点的堆有三层。根级别有 4 个节点永远不会移动。在叶级别之上的级别上,有两个节点可以潜在地向下移动一级(2 * 1)。根节点有一个节点可能会向下移动两级 (1*2)。

标签: algorithm time-complexity big-o heap heapsort


【解决方案1】:

1:考虑一些(为简单起见完整)二叉树。它有一个根,根下面有两个节点,下面有4个,依此类推。因此,高度为 h 的二叉树中的节点数为

1 + 2 + 2^2 + ... + 2^(h-1) = 2^h - 1

由于这是节点的数量 n,大约一半的节点 (n/2) 是叶子。在上面的级别中,节点的数量是叶子的一半,所以 n/4。

2: 你有一个运行时

C * 2^k * (1 + 2/2^1 + ... + (k+1)/2^k)

让我们将括号中的项称为 S(k)(取决于 k)。我们说当 k 逆无穷大时 S(k) 收敛。此外,它还在增加,因为 S(k+1) 是 S(k) 加上一个正项。因此,它必须始终低于其限制。会不会更高,我们不能再下来了。因此我们可以说存在一个常数 A(与 k 无关),使得所有 k 的 S(k)

因此我们可以将运行时写成

C * 2^k * (1 + 2/2^1 + ... + (k+1)/2^k) < C * 2^k * A = A * C * n/4 = O(n)

【讨论】:

    【解决方案2】:

    这是一种很长的解释,我之前理解 heapify() 也有同样的困难。所以,我想分享一下。如果您发现一些问题,请告诉我。谢谢。

    【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2017-01-28
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2018-06-27
    相关资源
    最近更新 更多