折半查找平均查找长度推导
《软件设计师教程》里关于折半查找的平均查找长度的计算过程有错字和不够完整的问题。在此详细推导一次。
设折半查找判定树结点总数为\(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)可得相同的结果。