一、顺序查找
在某个数组中查找某个key时的一般方法:
...
for(i=0;i<=n;i++){
if(key == a[i])
return ;
}
...
复杂度为O(n)
需要判断i<=n和key == a[i]两个语句。
顺序查找改进:
如在数组头放入key值,
...
a[0] = key;
while(a[i] != key){
i -- ;
}
...
复杂度为O(n)
只需要判断key != a[i]一个语句。
这种在查找方向的尽头放置“哨兵”,可以使得效率的提升。
二、折半查找(二分查找)
一般方法:
...
while(low < high){
mid = (low + high)/2;
if ...
}
...
优化:
插值查找:
将mid = (low + high)/2 = low + 1/2(high - low) 改进为 ===>>> mid = low + (key - a[low])/(a[high - a[low]])*(high - low)
这样在关键字分布较为均匀,表较大的情况下有明显的改善。
斐波那契(Fibonacci)查找:略。
思想都是改进mid的切分方法。