二分法及其优化

二分查找 ,将所给关键词和指定有序集合中间数进行比较,如果比较相等则返回结果,如果不相等,则按照所给出的结果,将集合减半后继续查找
//二分查找(折半查找)
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)
            return mid;
        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;


  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值