看严蔚敏版《数据结构》给出了折半查找的平均查找长度公式(如下图),但没有具体推导过程

所以我自己推导了一遍,用这篇文章把思路写下来
假设折半查找判定树为满二叉树,总节点数=nnn,高度(层数) =hhh
1、根据满二叉树的性质,总节点数 nnn 与高度(层数) hhh 的关系为
n=2h−1{\color{Black} n=2^{h}-1}n=2h−1
移项得
2h=n+1{\color{Black} 2^{h}=n+1}2h=n+1
取对数得,高度(层数)
h=log2(n+1){\color{Black} h=log_{2}{(n+1)}}h=log2(n+1)
2、根据满二叉树的性质,从第1层开始,每层的节点数为
第1层:21−1=1{\color{Black} 2^{1-1}=1}21−1=1 个节点(根节点)
第2层:22−1=2{\color{Black} 2^{2-1}=2}22−1=2 个节点
第3层:23−1=4{\color{Black} 2^{3-1}=4}23−1=4 个节点
……
第h层:2h−1{\color{Black} 2^{h-1}}2h−1 个节点
解释一下,上面严蔚敏版《数据结构》给出的平均查找长度公式
ASL=∑i=1nPiCi{\color{Black} ASL=\displaystyle \sum\limits_{i=1}^{n}P_{i}C_{i}}ASL=i=1∑nPiCi
Pi{\color{Black} P_{i}}Pi 代表查找到当前节点(第 i 个节点)的概率
Ci{\color{Black} C_{i}}Ci 代表查找到当前节点(第 i 个节点)的累计比较次数
PiCi{\color{Black} P_{i}C_{i}}PiCi代表查找到当前节点(第 i 个节点)的加权比较次数(概率×\times×累计比较次数)
∑i=1nPiCi{\color{Black} \displaystyle \sum\limits_{i=1}^{n}P_{i}C_{i}}i=1∑nPiCi 代表对n个节点的加权比较次数求和(即加权平均比较次数,简称平均比较次数)
为简化分析,设查找到每个节点是等概率的
因为总共n个节点且等概率,所以概率为 1n{\color{Black} \frac{1}{n}}n1
则Pi=1n{\color{Black} P_{i}=\frac{1}{n}}Pi=n1 变为常数,可以从求和式中提出
ASL=∑i=1nPiCi=∑i=1n1n Ci=1n∑i=1n Ci{\color{Black} ASL=\displaystyle \sum\limits_{i=1}^{n}P_{i}C_{i}=\displaystyle \sum\limits_{i=1}^{n}\frac{1}{n}\ C_{i}=\frac{1}{n}\displaystyle \sum\limits_{i=1}^{n}\ C_{i}}ASL=i=1∑nPiCi=i=1∑nn1 Ci=n1i=1∑n Ci
这里 ∑i=1n Ci{\color{Black} \displaystyle \sum\limits_{i=1}^{n}\ C_{i}}i=1∑n Ci 代表对n个节点的累计比较次数求和(即总比较次数)
所以平均查找长度可描述为:平均查找长度=概率×\times×总比较次数
现在问题就转为求总比较次数了
下面仅分析查找成功的情况:
从折半查找判定树的根节点开始
每经过一个节点就比较一次,比较查找值与当前节点值的大小
如果查找值小于当前节点值,则选择左孩子,继续比较
如果查找值大于当前节点值,则选择右孩子,继续比较
如果查找值等于当前节点值,则查找成功
对于左(右)孩子又会重复上述比较过程
所以查找成功的整个过程,刚好是从根节点到查找成功节点的路径
例如下图这颗折半查找判定树

本文详细推导了折半查找的平均查找长度公式,利用满二叉树的性质和数学方法,包括对数运算和复合数列求和,最终得到ASL与结点数n的关系。

1万+

被折叠的 条评论
为什么被折叠?



