二分法查找
二分法查找又叫折半查找,当数据量很大适宜采用该方法。注意采用二分法查找时,数据需是排好序的。
假设数据是按升序排序的,对于给定值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;
}
}
插值查找算法
- 插值查找原理介绍:
插值查找算法类似于二分查找,也是对二分查找的优化,不同的是插值查找每次从自适应 mid 处开始查找。 - 将折半查找中的求 mid 索引的公式 , min表示左边索引, max 表示右边索引
- 重点在于中间值的计算:
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;
}
}
插值查找注意事项:
- 对于数据量较大,关键字分布比较均匀的查找表来说,采用插值查找, 速度较快.
- 关键字分布不均匀的情况下,该方法不一定比折半查找要好