查找算法

二分法查找

二分法查找又叫折半查找,当数据量很大适宜采用该方法。注意采用二分法查找时,数据需是排好序的

假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

java代码:

public class BinarySearch {

	public static void main(String[] args) {
		int[] arr = {8,6,1,9,4,6,2,7,3};
		//排序
		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));
		int binarySearch = binarySearch(arr,1);
		System.out.println(binarySearch);
		
	}
	public static int binarySearch(int[] arr,int value) {
		int max = arr.length-1;		//最大索引值
		int min = 0;	//最小索引值
		int mid = (max+min)/2;	//中间值

		while(arr[mid]!=value) {
			if(max>=min) {
				if(value < arr[mid]) {
					max = mid-1;
				}
				if(arr[mid] < value) {
					min = mid+1;
				}
				 mid = (max+min)/2;	//重新计算中间值
			}else {
				return -1;
			}
		}
		//中间值就是所查找元素的索引值 
		return mid;		
		
	}
}

插值查找算法

  1. 插值查找原理介绍:
    插值查找算法类似于二分查找,也是对二分查找的优化,不同的是插值查找每次从自适应 mid 处开始查找。
  2. 将折半查找中的求 mid 索引的公式 , min表示左边索引, max 表示右边索引
  3. 重点在于中间值的计算:
    int mid = min + (max-min)*(value-arr[min]) / (arr[max]-arr[min]);

举例说明差值查找算法:

数组 arr = {1,2,3,…,100}
假如我们需要查找的值为:1
使用二分查找的话,我们需要多次递归,才能找到 1
使用差值查找算法
int mid = min + (max-min)*(value-arr[min]) / (arr[max]-arr[min]);
int mid = 0+ (99-0)x(1-1)/(100-1)=0+((99 x 0) /99) =0
比如我们查找的值为100
int mid = 0+ (99-0)x(100-1)/(100-1)=0+((99 x 99) /99) =99

java代码:

public class InsertValueSearch {

	public static void main(String[] args) {
		int[] arr = {8,6,1,9,4,6,2,7,3};
		//排序
		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));
		int binarySearch = binarySearch(arr,1);
		System.out.println(binarySearch);
		
	}
	public static int binarySearch(int[] arr,int value) {
		int max = arr.length-1;		//最大索引值
		int min = 0;	//最小索引值
		//自适应
		int mid = min + (max-min)*(value-arr[min]) / (arr[max]-arr[min]);	//中间值

		while(arr[mid]!=value) {
			if(max>=min) {
				if(value < arr[mid]) {
					max = mid-1;
				}
				if(arr[mid] < value) {
					min = mid+1;
				}
				 mid = min + (max-min)*(value-arr[min]) / (arr[max]-arr[min]);	//重新计算中间值
			}else {
				return -1;
			}
		}
		//中间值就是所查找元素的索引值 
		return mid;
	}
}

插值查找注意事项:

  1. 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
  2. 关键字分布不均匀的情况下,该方法不一定比折半查找要好
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值