本文来讲一种搜索算法,即二分搜索算法,通常在面试时也会被问到。

我们先来看一个例子,在图书馆通常是根据查到的编号去找书,可以在书架上按顺序一本本地查找,也可以找到一本书不符合预期时,再跳过一大部分书再查找,很显然,后者的效率高,这也是大部分人使用的方法,这种方法叫做二分搜索查找方法

二分搜索查找原理

二分搜索查找方法的核心思想是:在查找一次后将下一次搜索查找的空间减少一半,它要求搜索的序列值是单调的。如果序列是单调递增的,将查找目标值与序列的正中间值进行比较,如果相等则查找成功;如果查找目标值小于序列的正中间值,则下一次的搜索空间为正中间值的前面部分;如果查找目标值大于序列的正中间值,则下一次的搜索空间为正中间值得后面部分。如下图的数组

假如要查找元素8,那么先将8和数组中间的元素5进行比较,发现8比5大,那么下一次搜索空间为5后面的部分了,继续将后半部分的中间元素7与8进行比较,发现8比7大,那么下一次的搜索空间为7后面的部分了,再将7后面的中间元素8与8进行比较,发现相等,则查找成功。可以看出二分搜索查找算法的时间复杂度为O(log(n))。代码实现如下

int binary_search(int a[], int n, int x) { int left = 0; int rigt = n - 1; while(left < rigt) { int mid = (left + rigt) >> 1; if (a[mid] == x) { return x; } else if (a[mid] < x) { left = mid + 1; } else { rigt = mid - 1; } } return -1;}

二分搜索查找应用

为了更好地理解二分搜索查找算法,下面来看两个具体的应用。

1.给定一个正整数n,其中n小于10的8次方,求最小的正整数x,满足x的x次方为n位数。

先来看一个数x,它的位数怎么表示,很明显(int)log10(x) + 1就是表示x的位数,所以x的x次方的位数函数f(x)可以表示如下

很明显,这个函数是一个单调递增函数,需要求最小的正整数x,满足f(x)=n,那么x只需要在10的8次方内进行二分查找搜索就好了。

2.给定一个正整数n,其中n小于等于10的18次方,求如下方程的正整数解

因为n最大为10的18次方,很明显那么x肯定不会超过60,所以x可以从1枚举到60,当x固定时,等号左边关于y的函数明显是一个单调增函数,所以可以用二分搜索查找法来求y了,时间复杂度为O(log(n))。

下一节我将会讲三分搜索方法的原理与应用,欢迎大家关注,谢谢。

java 二分搜索获得大于目标数的第一位_程序员数据结构算法编程,二分查找搜索算法的原理与应用介绍!...相关推荐

  1. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  2. java 二分搜索获得大于目标数的第一位_遇到「最值问题」还在无脑动态规划?二分法考虑一下呗

    目录 前言 二分法基础及变种结构 小试牛刀 打怪升级 出师试炼 前言 一般来说,遇到「最值问题」通用的方法都是动态规划,而有一类「最值问题」可以用其他方法更加巧妙.简单方便的解决,这类问题的常见问法是 ...

  3. java 二分搜索获得大于目标数的第一位_Java后端架构师技术图谱,你都了解多少?...

    前言 欢迎工作一到五年的Java工程师朋友们加入我们,私信回复[资料]即可获取我们提供免费的Java架构学习资料(里面有高可用.高并发.高性能及分布式.Jvm性能调优.Spring源码, MyBati ...

  4. java获取字符串第一位_Java程序员经典面试题集大全 (十一)

    >>> 学习交流群 < < < 111. Java中byte表示的数值范围是什么? 答:范围是-128至127 112.如何将日期类型格式化为:2013-02-18 ...

  5. java项目合同制没做完扣钱吗_程序员接私活,怎样防止做完不给钱?

    首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况. 那么 ...

  6. 第一位女程序员奥古斯塔·爱达·金

    奥古斯塔·爱达·金,勒芙蕾丝伯爵夫人(Augusta Ada King, Countess of Lovelace,1815年12月10日-1852年11月27日),原名奥古斯塔·爱达·拜伦(Augu ...

  7. c++分治法求最大最小值实现_程序员:算法导论,分治法、归并排序,伪代码和Java实现...

    分治法 我们首先先介绍分治法.分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后在合并这些子问题的解来解决原问题的解. 还是拿扑克牌举例子,假设桌上有两堆牌面朝 ...

  8. java访问权限修饰符从大到小_程序员的术与道:道——Java修饰符之非访问控制修饰符...

    Java提供了很多修饰符,主要分为访问控制修饰符和非访问控制修饰符.通常放在语句的最前端,用来定义类.方法.变量. 下面介绍一下Java提供的非访问控制修饰符. static 修饰符:修饰类方法和类变 ...

  9. oracle 会话数上不去_程序员笔记|全面解析Oracle等待事件的分类、发现及优化

    一.等待事件由来 大家可能有些奇怪,为什么说等待事件,先谈到了指标体系.其实,正是因为指标体系的发展,才导致等待事件的引入.总结一下,Oracle的指标体系,大致经历了下面三个阶段: 以命中率为主要参 ...

最新文章

  1. 独家 | 一文读懂数据质量和验证检查(附代码)
  2. MM32F3277 MicroPython 的定时器功能
  3. oracle的clob赋值_JAVA处理Oracle数据库CLOB读写操作
  4. python实现一个简单的加法计算器_Python tkinter实现简单加法计算器代码实例
  5. unbuntu scim安装方法
  6. android替换电话应用,android – 替换调用应用程序
  7. 要启用实时(jit)调试 该应用计算机,解决%_启用实时(JIT)调试+编译应用程序时还必须启用方法歩骤?谁有最终解决方案?...
  8. C++学习笔记之二:通过结构体来理解类
  9. Ubuntu安装时怎样分区
  10. Oracle DBHelper
  11. [2019杭电多校第五场][hdu6628]permutation 1
  12. 高性能MySQL(第3版) 中文PDF带目录清晰版
  13. matlab中单相整流器,应用Matlab仿单相PWM整流器的一种简单方法
  14. XMAPP多端口配置
  15. 单片机霹雳灯双灯c语言,HOLTEK单片机-8LED霹雳灯
  16. lsnrctl command not found
  17. 山西天诚在线教育机构怎么样?靠谱么?
  18. 前端入门教程(四)head内常用标签与body内常用标签
  19. 和第三方接口对接总结
  20. 孔雀优化算法(Peafowl (Pavo Muticus/Cristatus) Optimization Algorithm, POA)

热门文章

  1. php项目中sql,php – 大括号{}在SQL查询中做了什么?
  2. java 字符串转dom对象_xml类型的字符串转换为Dom对象
  3. linux内核编译的image,内核编译时生成uImage的办法
  4. java 定义构造器_java的构造器定义以及使用
  5. mysql 修改数据库的数据库_如何更改MySQL数据库的数据库名
  6. VS2015启动调试程序变慢
  7. object detection错误Message type object_detection.protos.SsdFeatureExtractor has no field named bat
  8. 数据结构-哈希与映射
  9. python守护线程
  10. 解决$ is not define