插值搜索

     这是一种和二分比较相似的查找的算法, 不过不同的是, 对于分布比较均匀的较大的数组, 插值查找有时能够一次就搜索到位..
  为什么能够这么快呢`? 看网上没有什么关于这种算法的描述, 我就来描述一下吧.
  首先要知道一点, 这种搜索方式只能够针对顺序表进行,, 再一个要理解顺序表中的一个特点, 在顺序表中查找是否存在一个值, 此时我可以对顺序表中的任意一个元素进行比较, 如果我要在A中寻找值为t的元素是否存在, 那么我用a[i]和t进行比较, (a[i]可以是顺序表中任意一个元素..), 如果a[i]==t的话, i就是t所在的位置, 如果a[i] > t,  那么说明t一定不在在a[i], a[i+1]....a[n-1], a[n]... 也就是说现在只需要对a[1]..a[i-1]进行搜索即可..
  好好理解一下吧, 如果上面的理解不了, 那么插值查找就不好理解..
  接下来我用low和high来保存该搜索的范围, 在刚开始low=0, hight=n-1. 设i是在low到high之间的相对位置.. 如: 若 i= 0, low = 0, 那么就该让t和a[i + low]比较, 即判断t是否和a[0]相等..
  现在就是要确定i在哪里了..
  假设顺序表的分布比较均匀, 那么有下面的方程:
  (t - a[low]) : (i - low) = (a[high] - a[low]) : (high - low)
  i = (t - a[low]) * (high - low) / (a[high] - a[low]) + low;
  差不多了吧...
  我的语言表达能力有限, 若还不大理解, 就看代码吧:

 

    /* a是待搜索的顺序表,, size是a的长度, t 是待搜索的值 */  
    int search(int a[], int size, int t)  
    {  
        int low = 0, high = size - 1;  
        int pos;  
        while(low <= high){  
            pos = (t - a[low])/(a[high] - a[low])*(high - low) + low;  
            if(a[pos] == t){  
                return pos;  
            }  
            if(a[pos] > t){  
                high = pos - 1;  
            }else{  
                low = pos + 1;  
            }  
        }  
        return -1;  
    }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值