【数据结构与算法 12】二分查找

本文介绍了二分查找、插值查找和斐波那契查找三种在数据结构中的搜索算法,重点讨论了它们的适用场景、计算方法和代码实现,以及在不同数据分布情况下的优劣对比。作者还分享了个人在IT行业的经验,提供Java开发学习资源链接。

3、大话数据结构

二分查找的前提条件是需要有序表顺序存储,对于静态查找表,一次排序后不再变化,二分查找能得到不错的效率。但对于需要频繁执行插入或删除操作的数据集来说,维护有序的排序会带来不小的工作量,此时不建议使用二分查找。

4、代码实例

public static List binarySearch2(int[] arr, int left, int right, int findVal){

// 当 left > right 时,说明递归整个数组,但是没有找到

if (left > right) {

return new ArrayList();

}

int mid = (left + right) / 2;

int midVal = arr[mid];

if (findVal > midVal) { // 向 右递归

return binarySearch2(arr, mid + 1, right, findVal);

} else if (findVal < midVal) { // 向左递归

return binarySearch2(arr, left, mid - 1, findVal);

} else {

List resIndexlist = new ArrayList();

//向mid 索引值的左边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList

int temp = mid - 1;

while (true){

if(temp < 0 || arr[temp] != findVal){

break;

}

resIndexlist.add(temp);

temp–;

}

resIndexlist.add(mid);

//向mid 索引值的右边扫描,将所有满足 1000, 的元素的下标,加入到集合ArrayList

temp = mid + 1;

while (true){

if(temp > arr.length - 1 || arr[temp] != findVal){

break;

}

resIndexlist.add(temp);

temp++;

}

return resIndexlist;

}

}

三、插值查找


1、基本思想

基于二分查找算法,将查找点的选择改进为自适应选择,可以提升查找算法的平均性能比折半查找要好的多。

如果数组中分布不均匀,那么插值查找未必是很合适的选择。

2、mid变量的计算

在二分查找中:

mid=(left+right)/2;

在插值查找中:

mid=left + (right - left)*(findVal - arr[left])/(arr[right]-arr[left]);

这个公式很牛!

3、代码实例

public static int insertValueSearch(int[] arr, int left, int right, int findVal){

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;

}

}

4、插值查找算法和二分查找算法对比

(1)对于数据量较大,数值分布比较均匀的数组来说,使用插值查找算法,速度更快一些;

(2)但是对于数值分布不均匀的数组来说,建议使用二分查找算法;

四、斐波那契查找算法


1、基本思想

斐波那契数列又称黄金分割数列,黄金分割点,0.618。

{1,1,2,3,5,8,13,21,55},发现规律了吗,前一个数值除以后一个数值,无限接近0.618,这个数列就称为斐波那契数列。

2、mid值的计算

斐波那契查找算法和二分查找差不多,但斐波那契没有递归,只是换一种方法寻找mid值,

mid=left + fibonacciArr[f-1] -1;

先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

最后

看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面

小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

image

针对知识面不够,也莫慌!还有一整套的<Java核心进阶手册>,可以瞬间查漏补缺

image

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

image

image
补缺

[外链图片转存中…(img-rSo3Nxog-1711479436638)]

全都是一丢一丢的收集整理纯手打出来的

更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~

[外链图片转存中…(img-xbyFCD1k-1711479436638)]

[外链图片转存中…(img-OVFYcuAs-1711479436638)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值