插值查找算法

一、算法描述:

先来看一个实际问题:
我们在一本英汉字典中寻找单词“worst”,我们决不会仿照对半查找(或Fibonacci查找)那样,先查找字典中间的元素,然后查找字典四

分之三处的元素等等. 事实上,我们是在所期望的地址(在字典的很靠后的地方)附近开始查找的,我们称这样的查找为插值查找.
可见,插值查找不同于前面讨论的几种查找算法,前面介绍的查找算法是基于严格比较的,即假定我们对线性表中元素的分布一无所知(或

称没有启发式信息). 然而实际中,很多查找问题所涉及的表满足某些统计的特点.

插值查找在实际使用时,一般要满足两个假设条件:

(1)每一次对数据的访问与通常的指令相比,费用都是相当昂贵的。例如,待查找的表一定是在磁盘而非内存中,因而每一次比较都

要进行磁盘访问。

(2)数据不仅是已被排好序的,而且呈现均匀分布特征。

二、伪代码:

 

	insertValueSearch(R,n,element)
	 //实现给定有序均匀分布数组R中元素element的查找
	 //输入:数组R,数组长度n,待查找元素的位置
	 //有无待查找的元素
	 from←0 ,to←n-1                    //初始化起止位置
	 while(from <= to)							
	    middle ← from+(element-R[from])/(R[to]-R[from])*(to-from+0.5)//采用插值方法计算
	     if R[mid]=element  return mid
		if R[mid]>element  to←mid-1
		if R[mid]


三、具体实现:

/*
* 功能:该函数用来实现插值查找算法
* 输入:查找数组values,数组长度n,查找元素element
* 输出:返回元素的位置
*/
public static int insertValueSearch(int values[], int num, 	int element)
{
	//初始化起止端口号
	int from = 0;
	int to = num-1;
	//循环扫描
	while(from <= to)
	{
		//采用插值算法得到中间元素的位置
		int mid = (int)(from+(to-from)*(element-values[from])/(values[to]-values[from]));
		//进行判断是否找到该元素
		if(values[mid] > element)
		{
			to = mid-1;
		}
		else if(values[mid] < element)
		{
			from = mid+1;
		}
		else
		{
			//找到该元素,返回
			return mid;
		}
	}
	//未能查找到该元素
	return -1;
}

主函数调用:

public static void main(String[] args) {
	// TODO Auto-generated method stub
	//定义数组,用来存放待查找的元素
	int values[] = {1,2,5,7,11,14,16,17,20,22,25,28,30,33,35,38,40,42,46,50,53,57,58,60};
	int len = values.length;
	int result = insertValueSearch(values,len,21);
	if(result != -1)
	{
		System.out.println("待查找的元素位置为---->"+result);
	}
	else
	{
		System.out.println("不存在该元素!!");
	}
		
}

你可能感兴趣的:(算法设计与分析)