插值搜索——本质和二分无异,是利用数据分布的规律来定查找点,其基本假设是数据分布均匀
2017-03-20 20:21
281 查看
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
... 也就是说现在只需要对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代码
/* 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;
}
2.3 斐波那契查找
原理:利用斐波那契数列的性质,黄金分割的原理来确定mid的位置。代码如下:
[cpp] view plain copy
/*斐波那契 查找*/
int Fbonacci_Search(int *a, int n, int key)
{
int low,high,mid,i,k;
int F[] = {0,1,1,2,3,5,8,13,21,34}; //经典的斐波那契数列已经早就定义好,也可以递归自己求解。
low = 1;
high = n;
k = 0;
while(n > F[k] - 1) //计算 n 位于斐波那契数列的位置
k++;
for(i=n; i<F[k] - 1; i++) //将不满的数值补全
a[i] = a
;
while(low <= high)
{
mid = low + F[k-1] - 1; //利用斐波那契数列来找寻下一个要比较的关键字的位置
if(key < a[mid])
{
high = mid - 1;
k--;
}
else
{
if(key > a[mid])
{
low = mid + 1;
k = k -2;
}
else
{
if(mid <= n)
return mid;
else
return n;
}
}
}
}
总结:
折半查找进行加法与除法运算(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
相关文章推荐
- 【数据结构】二分查找及它的演变——插值查找
- 分治思想 - 二分搜索技术 - MATLAB代码 list是数据集合,x是要查找的数据。
- 看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)
- 利用Python进行数据导入、变化、统计和假设检验等基本数据分析
- 算法学习---基本数据类型的数组二分查找实现
- 算法学习---基本数据类型的数组二分查找实现
- 二分逼近&二分查找 高效解析800万大数据之区域分布
- leetcode+二分搜索查找,但是有重复数据有点不一样
- 二分法查找和快速排序 二分法是分治算法的一种特殊形式,利用分治策略求解时,所需时间取决于分解后子问题的个数、子问题的规模大小等因素,而二分法,由于其划分的简单和均匀的特点,是查找数据时经常采用的一种有
- 利用均匀分布产生随机的正态分布的数据输入源
- (转载)顺序查找、二分查找、插值查找、动态查找
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- Jim's游戏外挂学习笔记4——查找怪数据数组的内存分布和地址
- 利用泛型搜索出不同数据类型所在位置.
- 利用泛型搜索出不同数据类型所在位置.
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- 查找算法集:顺序查找、二分查找、插值查找、动态查找(数组实现、链表实现)
- Jim's游戏外挂学习笔记4—查找怪数据数组的内存分布和地址