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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。



由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以扫码领取!
最后
看完上述知识点如果你深感Java基础不够扎实,或者刷题刷的不够、知识不全面
小编专门为你量身定制了一套<Java一线大厂高岗面试题解析合集:JAVA基础-中级-高级面试+SSM框架+分布式+性能调优+微服务+并发编程+网络+设计模式+数据结构与算法>

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

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


补缺
[外链图片转存中…(img-rSo3Nxog-1711479436638)]
全都是一丢一丢的收集整理纯手打出来的
更有纯手绘的各大知识体系大纲,可供梳理:Java筑基、MySQL、Redis、并发编程、Spring、分布式高性能架构知识、微服务架构知识、开源框架知识点等等的xmind手绘图~
[外链图片转存中…(img-xbyFCD1k-1711479436638)]
[外链图片转存中…(img-OVFYcuAs-1711479436638)]
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!
本文介绍了二分查找、插值查找和斐波那契查找三种在数据结构中的搜索算法,重点讨论了它们的适用场景、计算方法和代码实现,以及在不同数据分布情况下的优劣对比。作者还分享了个人在IT行业的经验,提供Java开发学习资源链接。
5095

被折叠的 条评论
为什么被折叠?



