差值查找和二分查找的区别所在
二分查找:顾名思义每一次都是取得了数据的一半进行查找,在数据分布的相对比较均匀的时候,二分查找的效率还是很不错的。
比如说这个数组:{1, 2,3 , 4 ,5 , 6 ,7 , 8 ,9 , 10}
查找里面的任意一个数组最多也就只会花费3次的分组
但是如果这个数组的分配是极其不均匀的,比如以下数组
{1 , 1 ,1 , 1 ,1 , 1 ,1 , 1 ,1 , 1 ,9}
我们希望能够以更少的次数就可以找到这个数据9(当然二分查找是完全没有问题的),此时就是差值查找所要解决的事情了,二分查找每次都是分了一半。差值就是每次都分的更加的精确
差别所在
二分查找 mid = left + (right - left)/2
差值查找 mid = left + (right - left)*(findValue - nums[left] )/(nums[right] - nums[left])
二分查找代码:
private static int binarySearch(int[] arr, int left, int right, int findval) {
//如果左索引大于右索引,结束循环,因为没有找到
if (left > right){
return -1;
}
//声明变量
int mid = (left + right) / 2;
if (arr[mid] < findval){
return binarySearch(arr,mid + 1 ,right,findval);
}else if (arr[mid] > findval){
return binarySearch(arr,left,mid - 1,findval);
}else {
return mid;
}
}
差值查找代码
private static int insertValueSearch(int[] arr, int left, int right, int findVal) {
System.out.println("差值查找的次数~~");
if (left > right || findVal < arr[left] || findVal > arr[right]){
return -1;
}
int mid = left + (right - left)*(findVal - arr[left])/(arr[right] - arr[left]);
int midVal = arr[mid];
if (findVal > midVal){
return insertValueSearch(arr,mid + 1,right,findVal);
}else if (findVal < midVal){
return insertValueSearch(arr,left,mid - 1,findVal);
}else {
return mid;
}
}