二分查找法

二分查找的本质就是分治法,小时候有过这么一种猜数字的游戏,你在心中想一个大于0小于100的数字,然后我来提问,你只用回答是或者不是,比如“你想的数字比50大吗” 你说不是,那么就将范围缩小到0-50,反之范围就在50-100;
就这样逐步询问,最终总能猜到你心里想的数字,并且每次都以范围一半的值作为提问的参考值的话,你相对提问的次数是最少的,也就是提问的最优解;这就是二分法

二分查找发的基本思想

将n个元素分成大致相等的两部分,取a[n/2] ( a[]是数组,n/2是数组索引)与目标元素target作比较

  • 如果target = a[n/2],那这就是要找的元素
  • 如果target < a[n/2],继续搜索,搜索范围缩小到数组a的左半部分
  • 如果target > a[a/2],继续搜索,搜索范围缩小到数组a的右半部分

二分查找的时间复杂度

  • 因为循环时一层,所以有n个元素时间复杂度就是循环的次数k,n=>n/2=>n/4…=>n/2^k。
  • n足够大的时候极限n/2^k趋近与1
  • k = log2n
  • 时间复杂度为O(n) = O(log2n) 或者O(n) = O(logn)

实现

class Solution{public:int search (vecter<int>& nums,int target){int left = 0;int right = nums.size() - 1;while (left <= right){int mid =  left + (right-left)/2;if(nums[mid] == target){return mid;} else if(nums[mid] > target){right = mid -1;}else if(nums[mid] < target){left = mid -1;}}return -1;}
}
  • 这里有几个细节

    • 循环的终止条件用的是小于等于 while (left <= right),因为只是小于的时候回漏掉等于的情况就是[2,2]这种情况回终止循环返回-1;
    • 还有就是在计算这个
int mid =  left + (right-left)/2;

的时候 我们可以用left + ((right -left) >> 1 位运算提升性能;

【算法学习笔记】二分查找法相关推荐

  1. 算法(一):二分查找法

    算法基础: 一.大O表示法: 指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度): O(1)表示常数阶时间复杂度 O(log n),也叫对数时间复杂 ...

  2. 算法题3 二分查找法

    快速查找:二分查找法 有序数字:3,5,8,10,14,18,19,20,34,58 package com.interview;public class BinarySearch {public s ...

  3. 算法2(二分查找法)

    使用二分查找法的前置条件 必须是一个已经排好序的数组 二分查找定义 从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半. 示例图 循环版二分查找法 d ...

  4. 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作

    目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...

  5. python 二分查找算法_Python实现二分查找法

    用Python来实现二分查找 1.问题需求 输入列表[1,4,4,5,7,7,8,9,9,10]和目标整数1,输出其所在的位置为0,即第1次出现在第0个位置.输入列表[1,2,3,3,4,5,10]和 ...

  6. 小白的算法初识课堂(part1)--二分查找法

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 二分查找法 算法是一组完成任务的指令,任何代码片段都可视为算法.二分查找是一种算法,其输入是一个有序的元素列表(必须有序 ...

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

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

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

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

  9. 经典算法之左边界二分查找法(俗称左边界二分搜索法)

    经典算法之左边界二分查找法(俗称左边界二分搜索法) 文章目录 经典算法之左边界二分查找法(俗称左边界二分搜索法) 前言 一.什么左边界二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的 ...

最新文章

  1. 美国正在衰落的24个行业:“猝不及防”还是“温水煮青蛙”?
  2. CF B. Working out
  3. test case id - hash generation logic
  4. HDMI高清光端机产品特点及应用场合介绍
  5. 安装oracle到create inventory时卡住了怎么办_win10系统安装教程(官方工具)
  6. Java基础---分支结构(if--else / switch---case)
  7. 中断挂起是什么意思_深入JVM(三)- 什么是垃圾及垃圾回收算法
  8. python复习题答案_python的复习题和答案合集
  9. vue组件双向绑定.sync修饰符的一个坑
  10. 在delphi中嵌入脚本语言--(译)RemObjects Pascal Script使用说明(1)(译)
  11. 移动端适配的理解——REM方案
  12. 笔记本电脑频繁自动重启_电脑一直自动重启怎么办 电脑一直自动重启的原因和解决办法...
  13. 仙人掌相关问题的处理方法(未完待续)
  14. 针对车载系统相关的功能分析(车载OS、芯片、导航、DC、总线系统等)
  15. qt 飞扬青云_Qt编写安防视频监控系统(界面很漂亮)
  16. 实现以form-data参数发送post请求
  17. 塑化行业SCM供应链管理平台授信支付与供应链金融,轻松交易
  18. 聊聊关于复杂调查加权中权重对数据的分布影响
  19. Python实现:P5724 【深基4.习5】求极差 / 最大跨度值
  20. object-c陷阱

热门文章

  1. MediaStore.Images.Media.insertImage保存图片
  2. 照片做视频哪个软件好?简单但好用
  3. android组件化蘑菇街,蘑菇街 App 的组件化之路·续
  4. Arch下 OpenJDK shows intermittent performance and UI issues. We recommend using the Oracle JRE/JDK.
  5. 怎么校验一个数是否是素数(质数)以及如何更高效率的校验
  6. BAT打开一个URL网址
  7. Pandas的MultiIndex多层索引使用
  8. JavaScript实现POP窗体的onclose功能
  9. pytorch椎骨检测之分类模型
  10. go的滚咕噜咕噜滚和点心的龙卷风的实现原理