1.原理介绍
折半查找法中,每次都是对折之后再查找,但是实际上是可以不进行对折查找。比如说,我们在英语字典中查找某一个英语单词,首先会翻到这个单词的首字母的位置再进行查找,这种查找方式就叫做按比例查找。前提是均匀的一组有序数,这样比例才明显。它的基本思想就是,根据关键字在数组中的位置来确定mid的位置。查找成功或者失败的时间复杂度均为:O(loglogn)
假如low=1,high=100,key=60,a[low]=2,a[high]=102
mid = low + ((key-a[low])/(a[high]-a[low]))*(high-low);
mid=1+((60-2)/(102-2))*(101-1)=1+60=61
2.C++ 代码实现
int bin_search( int str[], int n, int key )
{
int low, high, mid;
low = 0;
high = n-1;
while( low <= high )
{ // 插值查找的唯一不同点
mid = low + ((key-a[low])/(a[high]-a[low]))*(high-low);
//按照比例取到最接近的位置
if( str[mid] == key )
return mid;
if( str[mid] < key )
low = mid + 1;
if( str[mid] > key )
high = mid - 1;
}
return -1;
}