算法基础:

一、大O表示法:

指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度):
O(1)表示常数阶时间复杂度
O(log n),也叫对数时间复杂度,这样的算法包括二分查找。
O(n),也叫线性阶时间复杂度,这样的算法包括简单查找。
O(n * log n), (n*对数复杂度)
O(n^2),平方阶时间复杂度
O(n!),阶乘阶时间复杂度
复制代码

n越来越大时,算法效率图解:

要点

  • 1.二分查找法只适用于从有序的队列中进行查找(比如数字和字母等),将队列排序后再进行查找

  • 2.二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要查找7次( 2^6 < 100 < 2^7)

  • 3.简单查询(遍历查询)的运行时间为线性时间O(n), 假设从[0,99]的队列中(n=100)寻到目标数30,则最多需要查找步数为100步

  • 4.对于容器内数量很少的情况下,2种查找也许没啥差别,当数量大的情况下,差别就很大,比如假设查找比较步骤一次需要1秒,当容量数目为100000时,O(n)需要100000秒即约27.8小时,而logn只需要 2^16 < 100000 < 2^17,即17秒,这差距非常的大

  • 5.时间复杂度都是针对最坏的情况所表示的,表示最多需要多少步

案例

从1~99的容器内,找出指定的数字;

java实现:
A:简单查找法,即遍历查找,全部遍历直到找到指定的数便停止/*** 简单查找* @param array    传入存放全部数据的容器* @param target   需要查找的目标数* @return*/
public Integer search(Integer[] array,int target){for(int i=0;i<array.length;i++){if(array[i] == target){return i;}}return null;
}B:二分查找法/*** 二分查找法* @param array   传入存放全部数据的容器* @param target  需要查找的目标数* @return*/
public Integer searchDichotomy(Integer[] array, int target){int low =0;int hight=array.length-1;while(low<=hight){                 //遍历还没结束int mid = (low+hight)/2;       //取中间值mid点位置if(array[mid]==target){        //寻找到目标数return mid;}if(array[mid] > target){        //如果中间值大于目标数,则将highr点位置移动mid位置左边hight = mid-1;}if(array[mid] < target){       //如果中间值小于目标数,则将low点位置移动mid位置右边low = mid+1;}}return null;
}
复制代码

图解:

假设容器中为[1,99],共99个数 必须明白因为时间复杂度是针对最坏情况的,二分查找所需最多为7步,简单遍历法最多为99步(当查找的是数99);

根据实际需要查找的数,所消耗的步骤不一定一样,但都不会超过时间复杂度

步骤图解如下所示([1,99],即n=99,查找的数为30):

时间复杂度推算过程:

参考:https://blog.csdn.net/frances_han/article/details/6458067 二分查找的基本思想是将n个元素分成大致相等的两部分,去a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x. 时间复杂度无非就是while循环的次数! 总共有n个元素, 渐渐跟下去就是n,n/2,n/4,....n/2^k,其中k就是循环的次数 由于你n/2^k取整后>=1 即令n/2^k=1 可得k=log2n,(是以2为底,n的对数) 所以时间复杂度可以表示O()=O(logn)

有兴趣共同进步可以扫描关注微信订阅号

算法(一):二分查找法相关推荐

  1. javascript数据结构与算法---检索算法(二分查找法、计算重复次数)

    javascript数据结构与算法---检索算法(二分查找法.计算重复次数) /*只需要查找元素是否存在数组,可以先将数组排序,再使用二分查找法*/ function qSort(arr){if (a ...

  2. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  3. 经典算法之二分查找法(俗称基本二分搜索法)

    经典算法之二分查找法(俗称二分搜索法) 文章目录 经典算法之二分查找法(俗称二分搜索法) 前言 一.什么是二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的是数学+思维+逻辑+数据结构 ...

  4. 【经典排序算法】二分查找法 (动图演示 + C 语言代码实现)

    [经典排序算法]二分查找法 (动图演示 + C 语言代码实现)   

  5. 每天5分钟玩转python3算法:二分查找法

    从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...

  6. java算法2_二分查找法

    比如现在有个记录名单的字典,里面的名字是按A-Z的顺序排好的,现在我想找Lily这个人.我可以从第一页开始一页一页的翻,但显然这样效率太低了.我可以怎么做呢?首先我直接翻到字典的中间位置,假如发现这里 ...

  7. 【javascript算法】二分查找法

    目录 1.二分查找算法 1.1定义 1.2流程图 1.3查找过程 2.javascript的实现 2.1 源码 2.2测试结果 2.3拓展题 1.二分查找算法 本文是根据有序数组升序的顺序来实现的 1 ...

  8. 数据结构与算法之二分查找法

    public static void main(String[] args) {         //目标数组         int[] arr = new int[] {1,2,3,4,5,6,7 ...

  9. 查找算法:二分查找、顺序查找

    08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/de ...

  10. java 二分查找_计算机入门必备算法——二分查找法

    1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...

最新文章

  1. python 词云_python数据可视化——词云
  2. java uml图中的关系_UML类图中的关系
  3. 如何在win10环境下运行debug
  4. 罗马数字转整数 · Roman to Integer
  5. 字符串操作练习:星座、凯撒密码、99乘法表、词频统计预处理
  6. JavaWeb学习之Path总结、ServletContext、ServletResponse、ServletRequest(3)
  7. ssms没有弹出服务器验证_使用SSMS扫描和查找SQL Server数据库的潜在安全漏洞
  8. 机器学习经典算法笔记——梯度下降算法
  9. php比较两个变量的值_总结PHP不用第三个变量交换两个变量的值的几种方法
  10. deepin安装zsh以及简单配置
  11. Could not connect to Redis at IP No route to host
  12. 腾讯云加入LoRa联盟成为发起成员,加速推动物联网到智联网的进化
  13. vue中的自定义分页插件组件
  14. 4图纸 rust_安诺伊模具丨机加工图纸有英语看不懂?不怕!史上最全翻译都在这...
  15. 1.Chrome开发者工具不完全指南(一、基础功能篇)
  16. 一个简单的音乐网站项目
  17. ftp工具哪个好,推荐8个超级好用而且免费的ftp工具,支持中文版windows系统的。
  18. 微信授权登陆服务器,微信公众号开发流程--微信第三方授权登陆流程
  19. vs2019安装时,一直卡在正在提取文件
  20. QQ小程序内测邀请码内部获取群

热门文章

  1. pageinfo对合并list进行分页_PageInfo实现分页
  2. 光盘中删除数据如何恢复_电脑硬盘数据恢复教程,EasyRecovery软件讲解,恢复删除数据...
  3. java中某对象的引用什么意思_在java中,引用对象变量和对象间有什么关系?()
  4. shell调用python脚本传递命名关键字参数_关于python:将字典作为关键字参数传递给函数...
  5. STM32F103单片机读取芯片自身ID
  6. Ubuntu环境搭建二:搭建samba服务器
  7. Qt实现表格内进度条展示数据
  8. 表格存储Tablestore权威指南(持续更新)
  9. 【JS第1期】深拷贝实现原理
  10. shell 整理(36)===写斐波那契数列