建立大根堆时,设有n个记录的初始序列所对应的完全二叉树的深度为h,建初堆时,每个非终端结点即非叶子节点都要自上而下进行"筛选"。由于第i层上的结点数小于等于
2
i
−
1
2^{i-1}
2i−1,且第i层结点最大下移的深度为h-i,每下移一层要做两次比较,则有:
h
=
⌊
l
o
g
2
(
n
)
⌋
+
1
h=\lfloor log_2(n)\rfloor+1
h=⌊log2(n)⌋+1
所以建初堆时关键字总的比较次数为:
∑
i
=
h
−
1
1
2
i
−
1
⋅
2
⋅
(
h
−
i
)
=
∑
i
=
h
−
1
1
2
i
(
h
−
i
)
\sum_{i=h-1}^1 2^{i-1}\cdot2\cdot(h-i)=\sum_{i=h-1}^12^i(h-i)
i=h−1∑12i−1⋅2⋅(h−i)=i=h−1∑12i(h−i)
令
j
=
h
−
i
,
则
:
i
=
h
−
j
令j=h-i,则:i=h-j
令j=h−i,则:i=h−j
∑
i
=
h
−
1
1
2
i
(
h
−
i
)
=
∑
j
=
1
h
−
1
2
h
−
j
⋅
j
=
∑
j
=
1
h
−
1
2
h
j
2
j
=
∑
j
=
1
h
−
1
2
⌊
l
o
g
2
(
n
)
⌋
+
1
⋅
j
2
j
\sum_{i=h-1}^12^i(h-i) = \sum_{j=1}^{h-1}2^{h-j}\cdot j = \sum_{j=1}^{h-1}2^h\frac j{2^j}=\sum_{j=1}^{h-1}2^{\lfloor log_2(n)\rfloor+1}\cdot\frac j{2^j}
i=h−1∑12i(h−i)=j=1∑h−12h−j⋅j=j=1∑h−12h2jj=j=1∑h−12⌊log2(n)⌋+1⋅2jj
∑
j
=
1
h
−
1
2
⌊
l
o
g
2
(
n
)
⌋
+
1
⋅
j
2
j
=
2
⌊
l
o
g
2
(
n
)
⌋
+
1
∑
j
=
1
h
−
1
j
2
j
≤
2
n
∑
j
=
1
h
−
1
j
2
j
\sum_{j=1}^{h-1}2^{\lfloor log_2(n)\rfloor+1}\cdot\frac j{2^j}=2^{\lfloor log_2(n)\rfloor+1}\sum_{j=1}^{h-1}\frac j{2^j}\leq2n\sum_{j=1}^{h-1}\frac j{2^j}
j=1∑h−12⌊log2(n)⌋+1⋅2jj=2⌊log2(n)⌋+1j=1∑h−12jj≤2nj=1∑h−12jj
S
=
1
2
+
2
2
2
+
3
2
3
+
.
.
.
+
h
−
2
2
h
−
2
+
h
−
1
2
h
−
1
S = \frac12+ \frac2{2^2}+\frac3{2^3}+...+\frac{h-2}{2^{h-2}}+\frac{h-1}{2^{h-1}}
S=21+222+233+...+2h−2h−2+2h−1h−1
2
S
=
1
+
2
2
+
3
2
2
+
.
.
.
+
h
−
2
2
h
−
3
+
h
−
1
2
h
−
2
2S =1+ \frac2{2}+\frac3{2^2}+...+\frac{h-2}{2^{h-3}}+\frac{h-1}{2^{h-2}}
2S=1+22+223+...+2h−3h−2+2h−2h−1
S
=
2
S
−
S
=
1
+
(
1
2
+
1
2
2
+
.
.
.
+
1
2
h
−
2
)
−
h
−
1
2
h
−
1
S = 2S - S = 1+(\frac12+\frac1{2^2}+...+\frac{1}{2^{h-2}})-\frac{h-1}{2^{h-1}}
S=2S−S=1+(21+221+...+2h−21)−2h−1h−1
S
=
1
+
(
a
1
−
a
n
∗
q
1
−
q
)
−
h
−
1
2
h
−
1
=
1
+
(
1
−
1
2
h
−
2
)
−
h
−
1
2
h
−
1
S = 1+(\frac {a_1-a_n*q}{1-q})-\frac{h-1}{2^{h-1}}=1+(1-\frac1{2^{h-2}})-\frac{h-1}{2^{h-1}}
S=1+(1−qa1−an∗q)−2h−1h−1=1+(1−2h−21)−2h−1h−1
当
n
→
∞
,
则
h
→
∞
,
lim
n
→
∞
S
=
lim
h
→
∞
S
=
2
当n\to \infty,则h\to \infty,\lim_{n\to \infty}S=\lim_{h\to \infty}S=2
当n→∞,则h→∞,n→∞limS=h→∞limS=2
故
:
建
立
堆
的
比
较
次
数
为
:
∑
i
=
h
−
1
1
2
i
(
h
−
i
)
≤
2
n
∑
j
=
1
h
−
1
j
2
j
<
4
n
故:建立堆的比较次数为:\sum_{i=h-1}^12^i(h-i)\leq2n\sum_{j=1}^{h-1}\frac j{2^j}<4n
故:建立堆的比较次数为:i=h−1∑12i(h−i)≤2nj=1∑h−12jj<4n
综上,建立堆的时间复杂度是O(n)的,暴力建堆的同志不要瞎闹!