欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

插值查找算法

程序员文章站 2022-07-12 09:28:51
...

一、插值查找算法基本思想

插值查找是一种在有序数组(前提条件)中查找某一特定元素的查找算法。插值查找基于二分查找**,不同的是插值查找每次从自适应mid处开始查找**,提高查找效率。

二分查找查找点和插值查找查找点计算如下:
插值查找算法
其中key为待查找元素,low为待查找区间左端,high为待查找区间右端,mid为自适应查找点
插值查找将上述的比例参数1/2改进为自适应,根据待查找元素在整个有序数组中所处的位置,使mid值的变化更靠近待查找元素key,可以间接地减少了比较次数。

二、代码实现

1、递归方式

package Search;

import java.util.Arrays;
import java.util.Scanner;

public class InsertValueSearch {
	public static int insertvaluesearch(int arr[],int value,int low,int high) {
		while(low<=high) {
			int mid=low+(high-low)*(value-arr[low])/(arr[high]-arr[low]);//插值查找中间索引公式
			if(arr[mid]==value) {//若中间位置值等于我们所需要查找值,即返回中间值
				return mid;
			}
			if(arr[mid]<value) {//若中间位置值小于我们所需查找值,则向右递归且将下界值变为mid+1
				return insertvaluesearch(arr,value,mid+1,high);
			}
			if(arr[mid]>value) {//若中间位置值大于我们所需查找值,则向左递归将上界值变为mid-1
				return insertvaluesearch(arr,value,low,mid-1);
			}
		}
		return -1;
	}

	public static void main(String[] args) {
		int[] arr= {31,17,5,47,11,33,3,19,13,59,1,43,41,37,7,53,29};
		Arrays.sort(arr);//采用插值查找时,需要对该数组进行排序
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入查找元素:");
		int value=sc.nextInt();
		System.out.printf("查找元素 %d 的位置是 %d ",value,insertvaluesearch(arr,value,0,arr.length-1));
	}
}

运行结果:

请输入查找元素:
37
查找元素 37 的位置是 11

2、非递归方式

package Search;

import java.util.Arrays;
import java.util.Scanner;

public class InsertValueSearch {
	public static int insertvaluesearch(int arr[],int value) {
		int low=0;//指针low表示待查元素所在范围的下界,下界索引从0开始
		int high=arr.length-1;//指针high表示待查元素所在范围的上界
		while(low<=high) {
			int mid=low+(high-low)*(value-arr[low])/(arr[high]-arr[low]);//插值查找中间索引公式
			if(arr[mid]==value) {//若中间位置值等于我们所需要查找值,即返回中间值
				return mid;
			}
			if(arr[mid]<value) {//若中间位置值小于我们所需查找值,则向右递归且将下界值变为mid+1
				low=mid+1;
			}
			if(arr[mid]>value) {//若中间位置值大于我们所需查找值,则向左递归将上界值变为mid-1
				high=mid-1;
			}
		}
		return -1;
	}
	public static void main(String[] args) {
		int[] arr= {31,17,5,47,11,33,3,19,13,59,1,43,41,37,7,53,29};
		Arrays.sort(arr);//采用插值查找时,需要对该数组进行排序
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入查找元素:");
		int value=sc.nextInt();
		System.out.printf("查找元素 %d 的位置是 %d ",value,insertvaluesearch(arr,value));
	}
}

运行结果:

请输入查找元素:
43
查找元素 43 的位置是 13 

三、插值查找算法的注意事项

(1)对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找时速度较快。
(2)在关键字分布不均匀的情况下,插值查找不一定比折半查找好

上一篇: 算法-插值查找

下一篇: 矩阵相似