2021/9/24 查找算法(4暴力,二分,插值,黄金)
2021/9/24 查找算法(4暴力,二分,插值,黄金)
sequence search
暴力查找,遍历数组
binary search
二分查找,递归。中止的条件是left > right时
private static int binarySearch(int[]arr,int left,int right,int value){
counts++;
int mid = left + (right-left) / 2; // 不会越界
while(left<=right){
if (arr[mid]>value){
return binarySearch(arr,left,mid-1,value);
}else if(arr[mid]<value){
return binarySearch(arr,mid+1,right,value);
}else {
return mid+1;
}
}
// left > right 未找到情况
return -1;
}
binary search v2 当value有多个时,找到所有下标
/**在上面基础上,在else中改动
*/
{
// else 条件中找到了value, 因为arr是有序的,我们只需要向左右遍历查看还有没有相同的值
int temp = mid-1;
while (temp >=0&& arr[temp]==value ){
list.add(temp);
temp --;
}
temp = mid+1;
while (temp <arr.length && arr[temp]==value ){
list.add(temp);
temp ++;
}
list.add(mid);
Collections.sort(list);
return list;
}
Interpolation Search 插值查找
与二分查找类似,不同点在于mid的策略
仔细想想为什么会是这样的把,, ,,
-- 假设这是一个等差数列,用值的比相当于路径的比。
如果你的key 更偏向a[low]或者a[high] 那么他就会向相应的方向靠。
Fibonacci Search 🌟
首先我们来介绍一下Fibonacci这个人吧
中世纪意大利数学家,是西方第一个研究斐波那契数的人。
斐波那契在《计算之书》中提出了一个有趣的兔子问题:
一般而言,兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有的兔子都不死,那么一年以后可以繁殖多少对兔子? 可以更简洁用这张图来看
两个连续的“斐波纳契数”的序列相互分割将接近黄金比例(1.618:1或1:0.618)。例如 233/144.
斐波那契数列也拿来处理股市..
✅ 回到斐波那契查找
K 表示第几个斐波那契数!!
紧接着就是代码实现部分。