【算法学习】四 二分法查找(折半法或者折半查找)
前言
社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。知识改变命运,学习成就未来。爱拼才会赢!
程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:。
https://github.com/ITfqyd/cxyxs
社长,4年api搬运工程师,之前做的都是一些框架的搬运工作,做的时间越长,越发感觉自己技术越菜,有同感的社友,可以在下方留言。现更侧重于java底层学习和算法结构学习,希望自己能改变这种现状。
为什么大厂面试,更侧重于java原理底层的提问,因为通过底层的提问,他能看出一个人的学习能力,看看这个人的可培养潜力。随着springboot的流行,大部分的开发,起步就是springboot。也不看看springboot为什么简单?他底层是如何实现的。为什么同样出来4年,工资差别都很大?这些问题都值得我们深思(对社长自己说的)。
api工程师,顶天了,最多达到某些公司中级工资上限,很难突破高级这道坎。希望我们大家成就更好的自己。回想起往事,不会后悔。
目录
前言:
一 什么是二分法查找?
二 实现思路
分三种情况:
学习中遇到问题后,我们应该如何处理?
二分法查找2种实现方式
非递归方式
递归方式
性能对比分析:
一 什么是二分法查找?
二分法也可以叫折半法,他是一种一种查询效率较高的方法。适用于数据量较大时,但是需要数据先排好顺序。
小结:遇到效率高,我们就应该引起注意,就跟ArrayList一样,他的查询效率高,但是只适合于单线程,因为他线程不安全。遇到类似的问题,我们应该多反问(社长的一万个为什么),多思考。多想想,他是不是有什么缺陷或者前提。
二 实现思路
一个班的成绩有高有低,从低到高排序 50 56 60 70 80 90 92 94 98
因为是二分,每次取一般,这里先定义三个变量header mid footer,注意是对应值的下标。
分三种情况:
第一种: 相等,表示找到了。
我要找的值就是80。Mid对应的值,刚好与我要查的值相等。就没有必要继续往下走。
第二种:需要查找的值小于mid,footer=mid-1
划重点上一次的mid是4,值为80,为什么上面画的图没有80?
在第一种情况里面已经判断过,那我们为什么还需要再判断一次勒,你们说是不是这个道理。觉得对的社友扣666。
有些有着求知欲的社友,又开始问了,header为,footer为3,mid咋是1,不应该是1.5吗?
社长我也不知道为什么是1。(0+3)/2 就是1。可以先去查看一下基础。
第三种:需要查找的值大于mid,header=mid+1
学习中遇到问题后,我们应该如何处理?
我发现有不少社友都继承了社长的一万个为什么,首先,积极提出问题,这点值得表扬。社长工作也有一段时间了,遇到问题,发现,大致的人群可以分为3种。
按王者荣耀的术语做一个级别划分
第一种,不敢请教别人,怕暴露自己的真实水平,同事之间,遇到不少这种,建议,有可能你一个问题,卡了几天,别人给你一分钟指导,就帮你解决了。 青铜选手
第二种,敢于请教,但不思。 遇到问题,需要虚心的请教别人,但是,自己不多思,多查。 白银选手
第三种:多思多查敢于请教。 黄金选手
二分法查找2种实现方式
非递归方式
package com.fyqd.test.sort;/*** Description:不使用递归方式* Author: 程序猿学社* Date: 2020/1/18 21:38* Modified By:*/
public class BinaryTest {public static int binary(int[] array, int value) {int low = 0;int high = array.length - 1;while (low <= high) {int middle = (low + high) / 2;if (value == array[middle]) {return middle;}if (value > array[middle]) {low = middle + 1;}if (value < array[middle]) {high = middle - 1;}}return -1;}public static void main(String[] args) {//50 56 60 70 80 90 92 94 98int[] a = {50, 56, 60, 70, 80, 90, 92, 94, 98};int score = 60;int value = binary(a,score);if(value == -1){System.out.println("没有找到,继续加油!");}else{System.out.println("找到了你真棒,分数为"+score+",索引为"+value);}}
}
递归方式
package com.fyqd.test.sort;/*** Description:使用递归方式* Author: 程序猿学社* Date: 2020/1/18 21:38* Modified By:*/
public class BinaryTest1 {public static int binary(int[] array, int value) {int header = 0;int footer = array.length - 1;return search(array,value,header,footer);}public static int search(int[] array, int value,int header,int footer){if(header > footer){return -1;}int middle = (header + footer) / 2;if (value == array[middle]) {return middle;}else if (value > array[middle]) {header = middle + 1;return search(array,value,header,footer);}else{footer = footer - 1;return search(array,value,header,footer);}};public static void main(String[] args) {//50 56 60 70 80 90 92 94 98int[] a = {50, 56, 60, 70, 80, 90, 92, 94, 98};int score = 980;int value = binary(a,score);if(value == -1){System.out.println("没有找到,继续加油!");}else{System.out.println("找到了你真棒,分数为"+score+",索引为"+value);}}
}
注意:使用递归方式,一定要给出终止条件
性能对比分析:
名称 | 时间复杂度 | 空间复杂度 | 描述 |
---|---|---|---|
普通排序 | O(N) | O(1) | 通过for循环一个个查找 |
二分法非递归方式 | O(logN) | O(1) | |
二分法使用递归方式 | O(logN) | O(1*logN) | 每次调用开销1,重复调用logN次,每次需要额外的开辟空间 |
二分法非递归方式性能最优,为什么
《算法学习》 一:为什么要学习算法?时间复杂度
历史算法文章推荐:
《算法学习》二 冒泡排序分析
【算法学习】三 选择排序分析
后记
程序猿学社的GitHub,欢迎Star:
https://github.com/ITfqyd/cxyxs
觉得有用,可以点赞,关注,评论,留言四连发。
【算法学习】四 二分法查找(折半法或者折半查找)相关推荐
- 算法学习四:算法性能分析理论基础——函数增长与渐进分析
算法学习四:算法性能分析理论基础--函数增长与渐进分析 在算法性能分析过程中,特别是在算法运行效率分析中,我们经常使用渐渐分析法,它使我们在分析算法性能时不必纠结于不同硬件平台的差异性,着重考虑算法的 ...
- 算法学习之——二分法解题超详细
[二分法]解题步骤超详细! 什么是二分法 二分法的通用格式 寻找一个数(基本的二分搜索) 什么是二分法 二分法,也称为折半法,是一种在有序数组中查找特定元素的搜索算法. 二分法查找的思路如下: (1) ...
- 算法学习笔记(2) 悬线法
本文属于「算法学习」系列文章之一.之前的[数据结构和算法设计]系列着重于基础的数据结构和算法设计课程的学习,与之不同的是,这一系列主要用来记录对大学课程范围之外的高级算法学习.优化与使用的过程,同时也 ...
- 【算法学习笔记】28.枚举法 解题报告 SJTU OJ 1255 1256 魔戒
1256. 你的魔戒?不,是你的魔戒.加强版 Description 在前往末日火山的途中,佛罗多与他的霍比特人同胞不幸被半兽人抓住了.半兽人要对每个霍比特人进行询问,以找出哪个霍比特人携带了至尊魔戒 ...
- 【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签
枚举法就好了,推理很麻烦,感觉也做不出来. 创造一个结构体,一个是真实的数,一个是花费的牙签数. 构建一位数,两位数,三位数即可. #include <iostream> #include ...
- C++ 算法学习四(直线、抛物线拟合)
好久没写博客了,忘了怎么开场,哈哈,小编在从事车道线检测,以及机器学习算法线性回归时都用到了线性拟合与多项式拟合,其实可以直接通过opencv的API接口也可实现,具体可见 polynomial_cu ...
- 《剑指offer》——04. 二维数组中的查找——暴力法、线性查找——java实现
文章目录 1.题目描述 2.解决方法 (1)暴力法 (2)线性查找(右上角->左下角) 参考: 1.题目描述 2.解决方法 (1)暴力法 如果不考虑二维数组排好序的特点,则直接遍历整个二维数组的 ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
- fifo算法_【算法学习】分枝限界法
分枝限界 关注那些不断已被他人成功应用的新思路.你的原创思想只应该应用在那些你正在研究的问题上. --托马斯·爱迪生(1847-1931) 这周到来的太快, 没想到这么快就迎来了考试. 干了这碗烤柿粥 ...
最新文章
- 改变自己,让自己变得更好
- python operator 多属性排序_又碰到一个非常实用的模块,以后的各种运算就用它了,python内置的常用包。
- 4行关键代码实现灰色模型GM(1, 1)
- 在 .NET 中使用 Flurl 高效处理Http请求
- java创建对象过七夕,想 new 个对象过七夕,她却抛了异常
- windows 安装openssh服务端_Git神器| SourceTree安装使用教程
- Linux进程管理与调度-之-目录导航【转】
- 在CentOS7下安装MySQL8数据库
- [Python 应用:爬虫] Selenium 之 XPath 语法
- EM算法——解释 转载
- Python 之父:移动设备中的 Python 应用“又大又慢”!
- MFC中获取各个窗口(对话框)之间的指针、对象、句柄
- 线性方程组(高斯消元)
- UWB测距及定位原理
- win7 快捷键 收集
- allure定制测试报告logo
- Linux signal捕获
- 使用echarts加载地图
- Yapi环境搭建(史上最详细步骤)
- 合肥计算机函授专业,2015年想学电脑,合肥哪个学校比较好点,中国计算机函授学院怎么样?...