基于自底向上 (Sift-Down) 策略的建堆时间复杂度推导

基于自底向上 (Sift-Down) 策略的建堆时间复杂度推导

目标: 运用代数推导与错位相减法,证明将 n n n 个无序节点构建为二叉堆的最坏情况时间复杂度为 O ( n ) O(n) O(n)

一、确定单层节点数、单层最大下沉步数

此处我们用满二叉树推导:

  • n n n:代表这颗满二叉树的总节点个数
  • h h h:代表这棵树的总高度(最大层数)
  • i i i:代表我们当前正在观察的第 i i i 层(取值范围是 1 到 h h h
    在这里插入图片描述

1. 第 i i i 层的节点总数

(说明:数学来源解析)

  • 逻辑推导: 在满二叉树中,每层节点数是上一层的 2 倍(等比关系)
  • 通用结论: 位于第 i i i 层的节点总数为 2 i − 1 2^{i-1} 2i1 个。
  • 规律列举:
    • 第 1 层节点数: 2 0 = 1 2^0 = 1 20=1
    • 第 2 层节点数: 2 1 = 2 2^1 = 2 21=2
    • h − 1 h-1 h1 层节点数: 2 h − 2 2^{h-2} 2h2 个(这是建堆真正的起始层)
    • h h h 层节点数: 2 h − 1 2^{h-1} 2h1 个(叶子节点(第 h h h 层)无子节点,天然满足堆性质。)

2. 第 i i i 层节点的最坏下沉步数

  • 推导逻辑: 节点最坏情况需要一直向下交换,直到叶子节点(第 h h h 层)为止
  • 通用结论: 位于第 i i i 层的节点,最多向下调整 h − i h-i hi
  • 规律列举:
    • 第 1 层节点:下方有 h − 1 h-1 h1 层,最多向下移动 h − 1 h-1 h1
    • 第 2 层节点:下方有 h − 2 h-2 h2 层,最多向下移动 h − 2 h-2 h2
    • h − 2 h-2 h2 层节点:下方有 2 层,最多向下移动 2 次
    • h − 1 h-1 h1 层节点:下方有 1 层,最多向下移动 1 次
    • h h h 层节点:下方有 0 层,最多向下移动 0 次

二、构建总步数函数 S ( h ) S(h) S(h),将每层节点数、最坏下沉步数进行乘积求和

1. 明确定义

我们推导的是基于树高 h h h 的总步数,必须严格记为 S ( h ) S(h) S(h)

2. 组装求和项

因为:

  • 总步数 = ∑ \sum (单层节点数 × \times × 单层节点最坏调整步数)
  • 第 1 层总移动步数: 2 0 × ( h − 1 ) 2^0 \times (h - 1) 20×(h1)
  • 第 2 层总移动步数: 2 1 × ( h − 2 ) 2^1 \times (h - 2) 21×(h2)
  • h − 2 h-2 h2 层总移动步数: 2 h − 3 × 2 2^{h-3} \times 2 2h3×2
  • h − 1 h-1 h1 层总移动步数: 2 h − 2 × 1 2^{h-2} \times 1 2h2×1

3. 得出等式 A

所以:

S ( h ) = 2 0 ( h − 1 ) + 2 1 ( h − 2 ) + 2 2 ( h − 3 ) + ⋯ + 2 h − 3 ⋅ 2 + 2 h − 2 ⋅ 1 —— (等式 A) S(h) = 2^0(h-1) + 2^1(h-2) + 2^2(h-3) + \dots + 2^{h-3} \cdot 2 + 2^{h-2} \cdot 1 \quad \text{—— (等式 A)} S(h)=20(h1)+21(h2)+22(h3)++2h32+2h21—— (等式 A)

4. 解释

观察等式 A 的每一项:

左侧因式 ( 2 0 , 2 1 , 2 2 , … 2^0, 2^1, 2^2, \dots 20,21,22,) 构成等比数列;右侧因式 ( h − 1 , h − 2 , h − 3 , … h-1, h-2, h-3, \dots h1,h2,h3,) 构成等差数列。

结论: S ( h ) S(h) S(h) 是一个差比数列求和模型。

三、运用错位相减法求解 S ( h ) S(h) S(h)

在这里插入图片描述

1. 等式 A

S ( h ) = 2 0 ( h − 1 ) + 2 1 ( h − 2 ) + 2 2 ( h − 3 ) + ⋯ + 2 h − 3 ⋅ 2 + 2 h − 2 ⋅ 1 —— (等式 A) S(h) = 2^0(h-1) + 2^1(h-2) + 2^2(h-3) + \dots + 2^{h-3} \cdot 2 + 2^{h-2} \cdot 1 \quad \text{—— (等式 A)} S(h)=20(h1)+21(h2)+22(h3)++2h32+2h21—— (等式 A)

2. 等式 B

为了消除中间的复杂项,把等式两边同乘等比数列的公比(公比 q = 2 q=2 q=2),计算出等式 B:
2 S ( h ) = 2 1 ( h − 1 ) + 2 2 ( h − 2 ) + 2 3 ( h − 3 ) + ⋯ + 2 h − 2 ⋅ 2 + 2 h − 1 ⋅ 1 —— (等式 B) 2S(h) = 2^1(h-1) + 2^2(h-2) + 2^3(h-3) + \dots + 2^{h-2} \cdot 2 + 2^{h-1} \cdot 1 \quad \text{—— (等式 B)} 2S(h)=21(h1)+22(h2)+23(h3)++2h22+2h11—— (等式 B)

3. 两个式子错位相减

为了化简等式,将 (等式 B - 等式 A),把对齐的中间项相减去除。
即:
S ( h ) = 2 1 + 2 2 + 2 3 + ⋯ + 2 h − 2 + 2 h − 1 − ( h − 1 ) S(h) = 2^1 + 2^2 + 2^3 + \dots + 2^{h-2} + 2^{h-1} - (h-1) S(h)=21+22+23++2h2+2h1(h1)

4. 化简

将等式尾部的 − ( h − 1 ) -(h-1) (h1) 拆解为 − h + 1 -h + 1 h+1
S ( h ) = 2 1 + 2 2 + 2 3 + ⋯ + 2 h − 1 − h + 1 S(h) = 2^1 + 2^2 + 2^3 + \dots + 2^{h-1} - h + 1 S(h)=21+22+23++2h1h+1

为了凑齐完整的等比数列,将常数 1 1 1 转化为 2 0 2^0 20,并将其移至数列首部:
S ( h ) = [ 2 0 + 2 1 + 2 2 + 2 3 + ⋯ + 2 h − 1 ] − h S(h) = [2^0 + 2^1 + 2^2 + 2^3 + \dots + 2^{h-1}] - h S(h)=[20+21+22+23++2h1]h

在这里插入图片描述

此时,上面等式中括号内的部分构成了标准的等比数列。
根据等比数列求和公式计算:

  • 首项 a 1 = 1 a_1 = 1 a1=1
  • 公比 q = 2 q = 2 q=2
  • 项数 k = h k = h k=h (从 2 0 2^0 20 2 h − 1 2^{h-1} 2h1,共有 h h h 项)

代入公式 S k = a 1 ( q k − 1 ) q − 1 S_k = \frac{a_1(q^k - 1)}{q - 1} Sk=q1a1(qk1) 计算得出:
S 等比 = 1 ⋅ ( 2 h − 1 ) 2 − 1 = 2 h − 1 S_{等比} = \frac{1 \cdot (2^h - 1)}{2 - 1} = 2^h - 1 S等比=211(2h1)=2h1

将该结果代回原式,得出最终的解:等比数列求和公式

在这里插入图片描述

S ( h ) = 2 h − 1 − h S(h) = 2^h - 1 - h S(h)=2h1h

四、变量代换与渐进复杂度分析

目标: 消去中间变量 h h h,将基于高度的函数 S ( h ) S(h) S(h) 转换为基于数据规模的函数 T ( n ) T(n) T(n)

1. 建立高度 h h h与节点数 n n n的映射关系

(前置知识验证:基于满二叉树等比求和性质及对数定义,映射关系成立)

2. 代换求解 T ( n ) T(n) T(n)

将上述映射关系直接代入第三阶段求出的 S ( h ) = 2 h − 1 − h S(h) = 2^h - 1 - h S(h)=2h1h 中:
T ( n ) = ( n + 1 ) − 1 − log ⁡ 2 ( n + 1 ) T(n) = (n + 1) - 1 - \log_2(n+1) T(n)=(n+1)1log2(n+1)
T ( n ) = n − log ⁡ 2 ( n + 1 ) T(n) = n - \log_2(n+1) T(n)=nlog2(n+1)

3. 大 O 渐进分析 (Asymptotic Analysis)

在大 O 表示法中,当数据规模 n n n 极大时,需忽略低阶项:

  • 量级对比: 线性项 n n n 的增长速率远大于对数项。例如当 n = 1 , 000 , 000 , 000 n = 1,000,000,000 n=1,000,000,000(十亿)时, log ⁡ 2 n \log_2 n log2n 仅约为 30。

在这里插入图片描述

  • 结论提取: 相比于 n n n,对数项 log ⁡ 2 ( n + 1 ) \log_2(n+1) log2(n+1) 微不足道,直接作为低阶项舍去。

最终结论: 整体调整步数收敛于线性级别,自底向上(Sift-Down)建堆的最坏情况时间复杂度严格证明为 O ( n ) O(n) O(n)


补充

补充推导 1:满二叉树的总节点数计算

返回

假设满二叉树高度为 h h h,总节点数为 n n n

各层节点数依次为:

  • 第一层: 2 0 2^0 20
  • 第二层: 2 1 2^1 21
  • 第三层: 2 2 2^2 22
  • h h h 层: 2 h − 1 2^{h-1} 2h1

总节点数 n n n 即为上述各项之和。根据等比数列求和公式 S k = a 1 ( q k − 1 ) q − 1 S_k = \frac{a_1(q^k - 1)}{q - 1} Sk=q1a1(qk1)

  • 首项 a 1 = 1 a_1 = 1 a1=1
  • 公比 q = 2 q = 2 q=2
  • 项数 k = h k = h k=h (共有 h h h 层)

代入公式,得出高度为 h h h 的满二叉树总节点数为:
n = S h = 1 ⋅ ( 2 h − 1 ) 2 − 1 = 2 h − 1 n = S_h = \frac{1 \cdot (2^h - 1)}{2 - 1} = 2^h - 1 n=Sh=211(2h1)=2h1

补充推导 2:通过对数公式求树高h

返回

已知满二叉树总节点数 n n n 与高度 h h h 的关系为: n + 1 = 2 h n + 1 = 2^h n+1=2h

对数公式复习:

  • 表达式: log ⁡ a b = x    ⟺    a x = b \log_a b = x \iff a^x = b logab=xax=b
  • 含义: a a a 的几次幂等于 b b b
  • 术语: a a a 为底数, b b b 为真数

代入转换:
既然 a x = b a^x = b ax=b 可以转换为 x = log ⁡ a b x = \log_a b x=logab
那么 2 h = n + 1 2^h = n + 1 2h=n+1 即可转换为:
h = log ⁡ 2 ( n + 1 ) h = \log_2(n+1) h=log2(n+1)

补充推导 3:等比数列求和公式推导(错位相减法)

返回

1. 明确定义与变量:

  • a 1 a_1 a1(或简写为 a a a):代表首项(数列里的第一个数字)。
  • q q q:代表公比(后一个数字是前一个数字的多少倍)。
  • n n n:代表项数(这串数字里一共有多少个数)。
  • S n S_n Sn:代表前 n n n 项的和(Sum)。

例子对应:

对于数列 1, 2, 4, 8, 16:

  • a 1 = 1 a_1 = 1 a1=1
  • q = 2 q = 2 q=2
  • n = 5 n = 5 n=5(一共有 5 个数)
  • 我们要求的目标就是 S 5 = 1 + 2 + 4 + 8 + 16 S_5 = 1 + 2 + 4 + 8 + 16 S5=1+2+4+8+16

2. 数列的通用表达形式

利用乘方概念,这串求和式子可以写成字母形式:

S n = a 1 + a 1 q + a 1 q 2 + a 1 q 3 + ⋯ + a 1 q n − 1 S_n = a_1 + a_1q + a_1q^2 + a_1q^3 + \dots + a_1q^{n-1} Sn=a1+a1q+a1q2+a1q3++a1qn1

(注意:最后一项是 q n − 1 q^{n-1} qn1,是因为第一项是从 q 0 q^0 q0 开始算的。)

3. 核心魔术:错位相减法

这是最关键的一步。我们要利用等式的性质和分配律,把中间那些复杂的加法全部消掉。

  • 第一步:列出原式

    S n = a 1 + a 1 q + a 1 q 2 + ⋯ + a 1 q n − 1 —— (式子 A) S_n = a_1 + a_1q + a_1q^2 + \dots + a_1q^{n-1} \quad \text{—— (式子 A)} Sn=a1+a1q+a1q2++a1qn1—— (式子 A)

  • 第二步:整体放大 q q q

    根据等式性质,两边同时乘 q q q

    q ⋅ S n = a 1 q + a 1 q 2 + a 1 q 3 + ⋯ + a 1 q n —— (式子 B) q \cdot S_n = a_1q + a_1q^2 + a_1q^3 + \dots + a_1q^n \quad \text{—— (式子 B)} qSn=a1q+a1q2+a1q3++a1qn—— (式子 B)

  • 第三步:相减(见证奇迹)

    用 (式子 B) 减去 (式子 A)。你会发现,中间长得一模一样的项都被“减没”了:

    ( q − 1 ) ⋅ S n = a 1 q n − a 1 (q - 1) \cdot S_n = a_1q^n - a_1 (q1)Sn=a1qna1

  • 第四步:提取公因式并变形

    根据分配律的反向提取:

    ( q − 1 ) ⋅ S n = a 1 ( q n − 1 ) (q - 1) \cdot S_n = a_1(q^n - 1) (q1)Sn=a1(qn1)

    最后,为了求出 S n S_n Sn,在前提条件 q ≠ 1 q \neq 1 q=1 的情况下,我们把 ( q − 1 ) (q - 1) (q1) 移到等号右边(变成除法):

    S n = a 1 ( q n − 1 ) q − 1 S_n = \frac{a_1(q^n - 1)}{q - 1} Sn=q1a1(qn1)

4. 最终公式与代入验证

这就是我们要找的等比数列求和公式。我们拿你笔记里的例子验证一下: 1 + 2 + 4 + 8 1 + 2 + 4 + 8 1+2+4+8(此时 a 1 = 1 , q = 2 , n = 4 a_1 = 1, q = 2, n = 4 a1=1,q=2,n=4)。

  • 方法一(硬算):

    1 + 2 + 4 + 8 = 15 1 + 2 + 4 + 8 = 15 1+2+4+8=15

  • 方法二(套公式):

    S 4 = 1 ⋅ ( 2 4 − 1 ) 2 − 1 = 16 − 1 1 = 15 S_4 = \frac{1 \cdot (2^4 - 1)}{2 - 1} = \frac{16 - 1}{1} = 15 S4=211(241)=1161=15

结论: 结果完全一致,推导逻辑闭环成立!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值