二分法及其优化

来源:互联网 发布:php源码如何传到服务器 编辑:程序博客网 时间:2024/06/03 15:29
二分查找,将所给关键词和指定有序集合中间数进行比较,如果比较相等则返回结果,如果不相等,则按照所给出的结果,将集合减半后继续查找
//二分查找(折半查找)
int BinarySearch1(int a[], int value, int n)
{
    int low, high,mid;
    low = 0;
    high = n-1;
 
   while(low<=high)
    {
       mid = (low+high)/2;
       if(a[mid]==value)
           returnmid;
       if(a[mid]>value)
           high =mid-1;
       if(a[mid]
           low =mid+1;
    }
    return -1;
}
------------------------------------------------------------------------------------------------------
插值查找

这里的插值查找法,是对二分法的一种改进。此法和二分法一样对数据要求有序且尽量分布均匀。
对于二分法有:
mid = (low + high)/2;
不难得到 mid = low + 1/2*(high-low);
试想,对于在字典中进行查找时,对于'you'或’and’来说,我们通常的处理方法肯定不是从中间开始进行查找,而是根据所给出的值,大致确定范围后再来进行查找。
这里的大致范围是通过,所查找的value值在所查集合中所大概处于的位置,定位到后进行比较
故有如下公式:
key = low + ((value - a[low])/(a[high]-a[low]))*(high-low);

伪代码:
int insertseek(int value,int map[])
   int low,high,key;
   low =0; 
   high = n -1 ;
while(low<=high)
key = low + ((value - low)/(high-low))*(high -low);
if(key = value) return key;
else if(key < value) low = key;
else  high = key;


原创粉丝点击