2.2 插值查找

这是一种和二分比较相似的查找的算法, 不过不同的是, 对于分布比较均匀的较大的数组, 插值查找有时能够一次就搜索到位.. 
  为什么能够这么快呢`? 看网上没有什么关于这种算法的描述, 我就来描述一下吧. 
  首先要知道一点, 这种搜索方式只能够针对顺序表进行,, 再一个要理解顺序表中的一个特点, 在顺序表中查找是否存在一个值, 此时我可以对顺序表中的任意一个元素进行比较, 如果我要在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; 
  差不多了吧... 
  我的语言表达能力有限, 若还不大理解, 就看代码吧:

C代码  
  1. /* a是待搜索的顺序表,, size是a的长度, t 是待搜索的值 */
  2. int search(int a[], int size, int t)
  3. {
  4. int low = 0, high = size - 1;
  5. int pos;
  6. while(low <= high){
  7. pos = (t - a[low])/(a[high] - a[low])*(high - low) + low;
  8. if(a[pos] == t){
  9. return pos;
  10. }
  11. if(a[pos] > t){
  12. high = pos - 1;
  13. }else{
  14. low = pos + 1;
  15. }
  16. }
  17. return -1;
  18. }

2.3 斐波那契查找

原理:利用斐波那契数列的性质,黄金分割的原理来确定mid的位置。
代码如下:
[cpp] view plaincopy
  1. /*斐波那契 查找*/
  2. int Fbonacci_Search(int *a, int n, int key)
  3. {
  4. int low,high,mid,i,k;
  5. int F[] = {0,1,1,2,3,5,8,13,21,34};     //经典的斐波那契数列已经早就定义好,也可以递归自己求解。
  6. low = 1;
  7. high = n;
  8. k = 0;
  9. while(n > F[k] - 1)  //计算 n 位于斐波那契数列的位置
  10. k++;
  11. for(i=n; i<F[k] - 1; i++)    //将不满的数值补全
  12. a[i] = a[n];
  13. while(low <= high)
  14. {
  15. mid = low + F[k-1] - 1;         //利用斐波那契数列来找寻下一个要比较的关键字的位置
  16. if(key < a[mid])
  17. {
  18. high = mid - 1;
  19. k--;
  20. }
  21. else
  22. {
  23. if(key > a[mid])
  24. {
  25. low = mid + 1;
  26. k = k -2;
  27. }
  28. else
  29. {
  30. if(mid <= n)
  31. return mid;
  32. else
  33. return n;
  34. }
  35. }
  36. }
  37. }

总结:

折半查找进行加法与除法运算(mid = (low + high) / 2),插值查找进行复杂的四则运算( mid = low + (key - a[low] / (a[high] - a[low]) * (high - low)) ),二斐波那契查找只是运用简单家减法运算 (mid  = low + f[k-1] -1) ,在海量的数据查找过程中,这种席位的差别会影响最终的查找效率。三种有序表的查找本质上是分割点的选择不同,各有优劣,实际开发可根据数据的特点综合考虑再做决定。

 

转自:http://zqynux.iteye.com/blog/627133

http://blog.csdn.net/wangyunyun00/article/details/23464359

转载于:https://www.cnblogs.com/bonelee/p/6591384.html

插值搜索——本质和二分无异,是利用数据分布的规律来定查找点,其基本假设是数据分布均匀...相关推荐

  1. c++Interpolation search插值搜索的实现算法之二(附完整源码)

    C++Interpolation search插值搜索的实现算法 C++Interpolation search插值搜索的实现算法完整源码(定义,实现,main函数测试) C++Interpolati ...

  2. c++Interpolation search插值搜索的实现算法之一(附完整源码)

    C++Interpolation search插值搜索的实现算法 C++Interpolation search插值搜索的实现算法完整源码(定义,实现,main函数测试) C++Interpolati ...

  3. 线性插值插值_揭秘插值搜索

    线性插值插值 搜索算法指南 (Searching Algorithm Guide) Prior to this article, I have written about Binary Search. ...

  4. SQL group by底层原理——本质是排序,可以利用索引事先排好序

    转自:http://blog.csdn.net/caomiao2006/article/details/52140993 由于GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比 ...

  5. sphinx 源码阅读之分词,压缩索引,倒排——单词对应的文档ID列表本质和lucene无异 也是外部排序再压缩 解压的时候需要全部扫描doc_ids列表偏移量相加获得最终的文档ID...

    转自:http://github.tiankonguse.com/blog/2014/12/03/sphinx-token-inverted-sort.html 外部排序 现在我们的背景是有16个已经 ...

  6. [蓝桥杯][2015年第六届真题]密文搜索(排序+二分)

    题目描述 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  7. 回归本质,虚拟资源如何利用电商平台,0成本挂机也能月入过万

    讲了很多期的网课项目,最多讲的是如何利用流量招代理,如何招站长,真正去运营卖课程卖资料我总是一笔带过,虽然说项目最终都是招商最赚钱,我也鼓励大家做招商,但是咱们不能把项目最原始的赚钱方式给丢掉, 那今 ...

  8. php神马搜索主动推送curl,如何利用curl主动推送url到各大搜索引擎(适用百度、搜狗、360搜索、神马)...

    相信seo技术人员都经常用到站长平台里面的数据推送,curl主动推送方式是一种很简单直接的推送方式,今天就来说一下这个改如何使用. curl是什么?就不多做解释了,百度会解释的更清楚,主要来说一下如何 ...

  9. 60. Leetcode 面试题 10.03. 搜索旋转数组 (二分查找-局部有序)

    搜索旋转数组.给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详.请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的.若有多个相同元素,返回索引值最小的一个.示例1 ...

最新文章

  1. 测试在强电磁场下基于HALL的电流传感器 ACS712-5A是否会有到影响?
  2. java对象如何保存日期_如何在Java中的日期对象中存储和检索毫秒?
  3. 1.1 HTML5简介
  4. [USACO13NOV]Crowded Cows【暴力枚举】
  5. MFC学习--文本框
  6. android 添加文件打开方式
  7. 第三方支付,微信支付及支付宝的一些入门了解
  8. 运用二维数组打印杨辉三角(找规律题)
  9. Gyro陀螺仪 > MPU 6000 vs ICM 20689
  10. python爬取有道翻译的代码_python爬虫之有道翻译
  11. linux权限750什么意思,chmod 777是什么意思?为您解释chmod 777及切勿使用chmod 777的原因...
  12. 洛谷_3975 [TJOI2015]弦论(后缀自动机)
  13. 电商新系统如何应对峰值
  14. chrome浏览器 快捷键设置
  15. 计算机辅助cad职称报考,计算机辅助设计绘图员(AUTO CAD)中级证
  16. 【蓝桥杯单片机(7)】数码管定时器显示任意字符串
  17. 漂亮MM超级搞笑问答
  18. 『NLP经典项目集』06: 使用预训练模型ERNIE-GEN自动写诗
  19. .启动ARCGIS提示“Automation错误”
  20. 逻辑卷增加,扩容,缩小,删除操作步骤

热门文章

  1. libevent多线程使用bufferevent的那些事
  2. 查看target/classes/.../dao/文件夹下,发现只有mapper的class文件,而没有xml文件 的解决方法。
  3. mysql max和order by_mysql – 为什么MAX()比ORDER BY慢100倍… LIMIT 1?
  4. java中random的头文件_JAVA中的Random()函數
  5. android发短信乱码,android 音乐信息乱码处理
  6. 上海大学计算机技术 a股,这所上海大学短时间就成为211,实力强劲却不为人知,适合捡漏...
  7. 使用elasticsearch-php需要注意的问题
  8. 【Kali渗透全方位实战】子域名的概念与探测(DNSenum工具和Sublist3r脚本的使用)
  9. python【蓝桥杯vip练习题库】ALGO-202二进制数数
  10. 【Deep Learning笔记】循环神经网络