次优二叉树 --- 折半查找在元素不等概情况下的改进

1、次优查找树是折半查找的一种一般形式,其理论基础是“被查找的各元素是不等概的”,而折半查找就是等概的,我们在使用中默认了这一性质。
比如,对于有序数组
int a = {1,2,3,4,5};
用折半查找时,应该现比较最中间的3,如果如果待查整数等于3,查找结束。如果小于3,就继续在左边的部分数组里查找;反之,在右边的数组里查找。
问题在于,我们为什么不从4开始找呢?为什么不从1开始呢?
因为在等概率的情况下,这样能让整体的平均搜索的长度(也就是次数)最小,实际也是二分查找树的深度最小。因为相同结点数的二叉树,越是丰满的二叉树高度越小。也就是说,每个节点的左右子树的高度差最小,二叉树的高度就越小,查找越底层的元素所需要的路径长度就越短,比较次数也越少(相同结点数完全二叉树的深度小于等于其他形态的二叉树的深度)。
我的ubuntu不好画图,给你个链接看看,你自己也可以画一下图。具有12个关键字的有序表,折半查找的平均查找长度()_牛客网。你把每个元素查找成功时的路径长度加起来看看,是不是完全二叉树最小?

2、现在我告诉你,每个元素被查找的概率是不一定相同的。刚才的办法还是最佳的吗?
比如按照刚才的查找树,元素5是最后一个,按照折半查找的话,每次查找都要花费3次比较才能找到,然而元素5被查找的概率是0.8,也就是说查了10000次,可能8000次都是它,那么这8000次查找就用了 times = 8000 * 3 = 24000次查找。但是如果把5放到查找树的根节点位置,那么是不是只需要8000次比较就行了?
所以,对于每个元素被查找的概率不同的情况下,折半查找不是最佳方法!

3、如果仅仅考虑查找成功的情况,构造一颗静态 最优查找树 的性能是最好的。
用数学公式来表示就是:使得 PH=ni=1ωihi 的PH值最小的树为该数组的静态最优查找树。其中i为节点标号, ωi

你可能感兴趣的:(数据结构(清华版)学习笔记,数据结构,次优查找树,折半查找)