二分查找和插值查找

1.二分查找

(1).首先确定该数组的中间的下标 mid = (left + right) / 2;

(2).然后让需要查找的数findVal和arr[mid]比较,如果findVal > arr[mid],说明你要查找的数在mid的右边,因此需要递归地向右查找;如果findVal < arr[mid],说明你要查找的数在mid的左边,因此需要递归地向左查找;如果findVal == arr[mid],说明你要查找的数就是arr[mid]。

(3).结束递归条件:找到;或递归完整个数组,仍然没有找到findVal,left>right。

public static int binarySerach(int[] arr,int left,int right,int target){
    // 前提:序列有序
    if(left > right) return -1; // 递归停止条件
    int mid = (left + right) / 2;
    int midVal = arr[mid];
    if(midVal < target) return binarySerach(arr,mid + 1,right,target);
    else if(mid > target) return binarySerach(arr,left,mid - 1,target);
    else return mid;
}

2.插值查找

1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应mid处开始查找,例如我们要从{1,8,10,89,1000,1234},

2)将折半查找中的求mid索引的公式,low表示左边索引,high表示右边索引。key就是findVal。

二分查找:mid = (low + high ) / 2 = low + 1/2 (high - low)                ---->                 插值查找:mid = low + [key - a[low]]/[a[high]-a[low]](high-low)

int midindex = low + (high-low) * (key - arr[low])/(arr[high] - arr[low]);

举例说明,数组arr = [1,2,3,...,100],假如要查找1,使用而二分查找需要多次递归,才能找到1;而插值查找按公式一次定位到0。

public static int insertSearch(int[] arr,int left,int right,int findVal){
    if(left > right || findVal < arr[left] || findVal > arr[right]) return -1;
    int mid = left + (findVal - arr[left])/(arr[right] - arr[left])*(right - left);
    int midVal = arr[mid];
    if(findVal < midVal) return insertSearch(arr,left,mid - 1,findVal);
    else if(findVal > midVal) return insertSearch(arr,mid + 1,right,findVal);
    else return mid;
}

对于数据量大,关键字分布比较均匀的查找表来说,采用插值查找,速度比较快。
关键字分布不均匀的情况下,该方法不一定比二分查找要好。

3.斐波那契(黄金分割法)查找(未完)

1)黄金分割点是指把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618。由于按此比例涉及的造型十分美丽,也因此称为黄健分割,也称为中外比。

斐波那契查找原理与前两种相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近,即mid = low + F(k - 1) - 1

F代表斐波那契数列

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值