《軟件設計師教程》里關於折半查找的平均查找長度的計算過程有錯字和不夠完整的問題。在此詳細推導一次。
設折半查找判定樹結點總數為\(n=2^h-1\),則判定樹是深度為\(h=log_2(n+1)\)的滿二叉樹。在等概率情況下,折半查找平均查找長度為:
\[ASL_{bs}=\displaystyle\sum_{i=1}^n P_i C_i = \frac{1}{n} \displaystyle\sum_{j=1}^h j\cdot2^{j-1}=\frac{n+1}{n} \log_2(n+1)-1 \]
在等概率情況下,有n個結點的二叉樹中,每個結點被查找的概率分布為\(\frac{1}{n}\)。而每個結點被找到所需的比較關鍵字次數(查找長度)等於該結點所在的樹的層數。
對於滿二叉樹,第j層的結點數有\(2^{j-1}\)個。因此當二叉樹的結點個數滿足\(n=2^h-1\),其中h為自然數時,
\[ASL_{bs}=\frac{1}{n}\sum_{j=1}^h j\cdot2^{j-1} \]
其中,\(\sum_{j=1}^h j\cdot2^{j-1}\)可用錯位相減法求出通項:
設
\[S=1\times 2^0+2\times2^1+3\times2^2+\dotsb+h\times2^{h-1} \tag{1} \]
這是等差乘等比的情況,其中等比數列公比為2.
令
\[2S=1\times 2^1+2\times2^2+3\times2^3+\dotsb+h\times2^{h} \tag{2} \]
(1)-(2)可得
\[S-2S=1\times 2^0+(2-1)\times2^1+(3-2)\times2^2+\dotsb+(h-(h-1))\times2^{h-1}-h\times2^h \]
\[(1-2)S=1-h\cdot2^h+\sum_{i=1}^{h-1}2^i \]
最后一項套用等比數列求和公式,可得
\[\begin{aligned} (1-2)S&=1-h\cdot2^h+\frac{2(1-2^{h-1})}{1-2}\\ (1-2)S&=(1-h)2^h-1 \end{aligned}\]
\[S=(h-1)2^h+1\tag{3} \]
因為\(n=2^h-1\),即\(h=log_2(n+1)\),將h代入(3):
\[\begin{aligned} S&=(log_2(n+1)-1)(n+1)+1\\ &=(n+1)log_2(n+1)-n \end{aligned}\]
因此,
\[ASL_{bs}=\frac{1}{n}S=\frac{n+1}{n}log_2(n+1)-1 \]
如果結點總數未能布滿一棵二叉樹,即“\(n=2^h-1\),h為自然數”這個條件不成立。此時等概率的\(ASL_{bs}\)可用如下方法計算:
令\(h=\lfloor\log_2(n+1)\rfloor\),\(r=n-(2^h-1)\),\(v=n-r\),此時
\[ASL_{bs}=\frac{1}{n}\left[\sum_{j=1}^{h}j\cdot2^{j-1}+r(h+1)\right] \]
\[ASL_{bs}=\frac{1}{n}(v+1)log_2(v+1)-v+\frac{1}{n}r(h+1)\tag{4} \]
例如,當n=4時,h=2,r=1,
直觀地將這4個結點置於折半查找樹,可得
\[ASL=\frac{1}{4}\cdot(1+2+2+3)=2 \]
將參數代入(4)可得相同的結果。