前言

社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的。知识改变命运,学习成就未来。爱拼才会赢!
程序猿学社的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. 算法学习之——二分法解题超详细

    [二分法]解题步骤超详细! 什么是二分法 二分法的通用格式 寻找一个数(基本的二分搜索) 什么是二分法 二分法,也称为折半法,是一种在有序数组中查找特定元素的搜索算法. 二分法查找的思路如下: (1) ...

  3. 算法学习笔记(2) 悬线法

    本文属于「算法学习」系列文章之一.之前的[数据结构和算法设计]系列着重于基础的数据结构和算法设计课程的学习,与之不同的是,这一系列主要用来记录对大学课程范围之外的高级算法学习.优化与使用的过程,同时也 ...

  4. 【算法学习笔记】28.枚举法 解题报告 SJTU OJ 1255 1256 魔戒

    1256. 你的魔戒?不,是你的魔戒.加强版 Description 在前往末日火山的途中,佛罗多与他的霍比特人同胞不幸被半兽人抓住了.半兽人要对每个霍比特人进行询问,以找出哪个霍比特人携带了至尊魔戒 ...

  5. 【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

    枚举法就好了,推理很麻烦,感觉也做不出来. 创造一个结构体,一个是真实的数,一个是花费的牙签数. 构建一位数,两位数,三位数即可. #include <iostream> #include ...

  6. C++ 算法学习四(直线、抛物线拟合)

    好久没写博客了,忘了怎么开场,哈哈,小编在从事车道线检测,以及机器学习算法线性回归时都用到了线性拟合与多项式拟合,其实可以直接通过opencv的API接口也可实现,具体可见 polynomial_cu ...

  7. 《剑指offer》——04. 二维数组中的查找——暴力法、线性查找——java实现

    文章目录 1.题目描述 2.解决方法 (1)暴力法 (2)线性查找(右上角->左下角) 参考: 1.题目描述 2.解决方法 (1)暴力法 如果不考虑二维数组排好序的特点,则直接遍历整个二维数组的 ...

  8. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

  9. fifo算法_【算法学习】分枝限界法

    分枝限界 关注那些不断已被他人成功应用的新思路.你的原创思想只应该应用在那些你正在研究的问题上. --托马斯·爱迪生(1847-1931) 这周到来的太快, 没想到这么快就迎来了考试. 干了这碗烤柿粥 ...

最新文章

  1. 改变自己,让自己变得更好
  2. python operator 多属性排序_又碰到一个非常实用的模块,以后的各种运算就用它了,python内置的常用包。
  3. 4行关键代码实现灰色模型GM(1, 1)
  4. 在 .NET 中使用 Flurl 高效处理Http请求
  5. java创建对象过七夕,想 new 个对象过七夕,她却抛了异常
  6. windows 安装openssh服务端_Git神器| SourceTree安装使用教程
  7. Linux进程管理与调度-之-目录导航【转】
  8. 在CentOS7下安装MySQL8数据库
  9. [Python 应用:爬虫] Selenium 之 XPath 语法
  10. EM算法——解释 转载
  11. Python 之父:移动设备中的 Python 应用“又大又慢”!
  12. MFC中获取各个窗口(对话框)之间的指针、对象、句柄
  13. 线性方程组(高斯消元)
  14. UWB测距及定位原理
  15. win7 快捷键 收集
  16. allure定制测试报告logo
  17. Linux signal捕获
  18. 使用echarts加载地图
  19. Yapi环境搭建(史上最详细步骤)
  20. 合肥计算机函授专业,2015年想学电脑,合肥哪个学校比较好点,中国计算机函授学院怎么样?...

热门文章

  1. 企业微信app中退出某个企业 最新版 图文
  2. IDEA自定义注释模板(javadoc)
  3. dmp标签_[重磅推荐]你必须知道的京准通DMP知识!
  4. 深度自动编码器(Deep Auto-encoder)
  5. Tokenview.io推出ETH 2.0信标链浏览器
  6. 从机器学习到大模型(零基础)
  7. MySQL 计算两个日期/时间之间相差的天数、分钟数、秒数...
  8. Ubuntu Snap商店代理设置方法
  9. 叮咚小区官网新闻已不更新
  10. 详解Bash命令行处理