关于折半查找,书上的介绍有点不理解。平均查找长度怎么算的?
书上说:
假定有序表的长度n=2^h-1,则描述这边查找的判定树是深度为h的满二叉树。树中层次为1的结点有1个,层次为2的结点有2个……,层次为h的结点有2^(h-1)个。假设表中每个记录的查找概率相等(Pi=1/n),则查找成功时折半查找的平均查找长度
ASLbs=Pi*Ci(i从1到n)
=(1/n)(j*2^(j-1))(j是从1到h)
为什么不是(1/n)*j呢?不是第j层之前只比较了j个记录吗?不是每一层只比较一次吗?
书上说:Ci为找到表中其关键字与给定值相等的第i个记录时,和给定值已进行过比较的关键字个数
[解决办法]
1, 3, 5, 7, 9, 11, 13
对以上有序数组,查找关键字8,自己走一遍看看,是不是你想的那样。然后把相应的二叉搜索树画出来,再看看是怎么找的。
[解决办法]
注意1/n是每个节点被查找的概率,而所求的是平均查找长度。
如果是顺序查找,那么平均查找长度=(1/n)*(1+2+3+...+n)
如果是二分查找,那么平均查找长度=(1/n)*(1+2+2+3+3+3+3+...h+h+h+h...)
对于h层的节点有2^(h-1)个
你没搞懂的应该是这个求的是平均查找长度,所以要遍历每一个节点的查找长度.
[解决办法]
这是求平均查找长度呀,就是所有n个节点的期望!
如果你只求一次的查找长度,那么可以去掉1/n,然后就是j了呀