《算法导论》6.3-3
第一次写博客,不完美之处,多多包涵
证明:在任一含n个元素的堆中,至多有
⌈
n
/
2
h
+
1
⌉
\lceil n/2^{h+1}\rceil
⌈n/2h+1⌉个高度为h的结点。
1.先看简单情况:
n
=
2
k
−
1
n=2^k-1
n=2k−1
则高度为h的节点数易知为
2
k
−
h
−
1
2^{k-h-1}
2k−h−1
而
⌈
n
/
2
h
+
1
⌉
\lceil n/2^{h+1}\rceil
⌈n/2h+1⌉=
⌈
2
k
−
1
/
2
h
+
1
⌉
\lceil {2^k-1}/2^{h+1}\rceil
⌈2k−1/2h+1⌉=
2
k
−
h
−
1
2^{k-h-1}
2k−h−1
则两者相等
2.假设此时该堆叶节点并非都处于同一行
令n =
2
k
2^k
2k+m-1 (m<
2
k
2^k
2k)
则高度为h的节点数为
⌈
m
/
2
h
⌉
\lceil m/2^h\rceil
⌈m/2h⌉+
2
k
−
1
−
h
−
2
∗
⌈
m
/
4
⌉
2
h
2^{k-1-h}-\frac{2*\lceil m/4 \rceil}{2^h}
2k−1−h−2h2∗⌈m/4⌉
而
⌈
n
/
2
h
+
1
⌉
\lceil n/2^{h+1}\rceil
⌈n/2h+1⌉=
⌈
2
k
−
1
+
m
/
2
h
+
1
⌉
\lceil {2^k-1+m}/2^{h+1}\rceil
⌈2k−1+m/2h+1⌉=
2
k
−
1
−
h
2^{k-1-h}
2k−1−h+
⌈
m
−
1
2
h
+
1
⌉
\lceil \frac {m-1}{2^{h+1}} \rceil
⌈2h+1m−1⌉
再令m =
k
∗
2
h
+
c
k * 2^h +c
k∗2h+c
若c=0
则
⌈
m
/
2
h
⌉
\lceil m/2^h\rceil
⌈m/2h⌉=
k
k
k
2
∗
⌈
m
/
4
⌉
/
2
h
2*\lceil m/4 \rceil/2^h
2∗⌈m/4⌉/2h=
k
/
2
k/2
k/2
⌈
m
−
1
2
h
+
1
⌉
\lceil \frac {m-1}{2^{h+1}} \rceil
⌈2h+1m−1⌉ =
⌈
k
/
2
⌉
\lceil k/2 \rceil
⌈k/2⌉
易知不等式成立
若c=1
则
⌈
m
/
2
h
⌉
\lceil m/2^h\rceil
⌈m/2h⌉=
k
+
1
k+1
k+1
2
∗
⌈
m
/
4
⌉
/
2
h
2*\lceil m/4 \rceil/2^h
2∗⌈m/4⌉/2h=
⌈
k
∗
2
h
+
1
4
⌉
/
2
h
−
1
\lceil \frac{k*2^h+1}4\rceil/2^{h-1}
⌈4k∗2h+1⌉/2h−1
⌈
m
−
1
2
h
+
1
⌉
\lceil \frac {m-1}{2^{h+1}} \rceil
⌈2h+1m−1⌉ =
⌈
k
/
2
⌉
\lceil k/2 \rceil
⌈k/2⌉ =
⌈
k
/
2
⌉
\lceil k/2 \rceil
⌈k/2⌉
易知不等式成立