l顺序查找表中的查找算法简单,但平均查找长度较大,特别不适用于表长较大的查找表。
l若以有序表表示静态查找表,则查找过程可以基于“折半”进行。
int Search_Bin ( SSTable ST, KeyType kval ) {
low = 1; high = ST.length; // 置区间初值
while (low <= high) {
mid = (low + high) / 2;
if (kval == ST.elem[mid].key )
return mid; // 找到待查元素
else if ( kval < ST.elem[mid].key) )
high = mid - 1; // 继续在前半区间进行查找
else low = mid + 1; // 继续在后半区间进行查找
}
return 0; // 顺序表中不存在待查元素
} // Search_Bin
最大查找次数=
一般情况下,表长为 n 的折半查找判定树的深度和含有 n 个结点的完全二叉树的深度相同。
假定有序表的长度为 n=2h-1,则h=log2(n+1);设查找概率相等,Pi=1/n。 则:
在n>50时,可得近似结果
斐波那契查找:可以根据斐波那契序列的特点对有序查找表进行分割。
分割区间的原则:
若表长为 n =F (k)-1, 则选择查询点为F (k-1); 前一个子表的长度为F (k-1)-1;后一个子表的长度为F (k-2)-1;
n =F (k)-1= F (k-1)+F (k-2)-1={ F (k-1)-1} + 1 + {F (k-2)-1}
1. 平均性能比折半查找好;2. 最坏情况比折半差; 3. n很大时,黄金分割法;
关于斐波那契查找的代码我在下面的blog里看的比较清楚
https://blog.csdn.net/luochoudan/article/details/51629338#commentBox
这样说吧,感觉斐波那契查找是一种变形的二分查找
只不过查找过程中mid不再等于low和high的平均值了,而是
mid = low + fib[k - 1] - 1; // 根据斐波那契数列进行分割
在不等概率查找的情况下,折半查找不是最好的查找方法
问题:如果已知查找概率,判定树为何种二叉树时,平均查找性能最佳?
如果只考虑查找成功的情况,则使平均查找性能达到最佳的判断树是其带权内路径长度之和取最小值的二叉树。即:PH取值最小。
定义:使PH值达到最小的判定树称为最优二叉树。
一种次优二叉树的构造方法:已知一个按关键字有序的序列: rl, rl+1 , … , rh )
每个记录对应的权值(概率值)为:( wl, wl+1 , … , wh )
1. 在记录序列中,取第 i 个记录构造根结点,使:
取最小值。
2. 然后继续对子序列{ rl, rl+1,…,ri-1 } 和 { ri+1,…, rh }
构造两棵次优二叉树,并分别为根结点的左子树
和右子树。