【算法学习笔记】二分查找法
二分查找法
二分查找的本质就是分治法,小时候有过这么一种猜数字的游戏,你在心中想一个大于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 位运算提升性能;
【算法学习笔记】二分查找法相关推荐
- 算法(一):二分查找法
算法基础: 一.大O表示法: 指示算法的速度有多快,用于指出随数量的增大,算法的所需步骤增加的速度,常见的大O运行时间(时间复杂度): O(1)表示常数阶时间复杂度 O(log n),也叫对数时间复杂 ...
- 算法题3 二分查找法
快速查找:二分查找法 有序数字:3,5,8,10,14,18,19,20,34,58 package com.interview;public class BinarySearch {public s ...
- 算法2(二分查找法)
使用二分查找法的前置条件 必须是一个已经排好序的数组 二分查找定义 从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半. 示例图 循环版二分查找法 d ...
- 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...
- 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]和 ...
- 小白的算法初识课堂(part1)--二分查找法
学习笔记 学习书目:<算法图解>- Aditya Bhargava 二分查找法 算法是一组完成任务的指令,任何代码片段都可视为算法.二分查找是一种算法,其输入是一个有序的元素列表(必须有序 ...
- java 二分查找_计算机入门必备算法——二分查找法
1.引言 笔者对于计算机的研究一直停滞不前,近期想对一些算法进行复习和进一步的研究,每天都会更新一个新的算法,算法有难有易,层层递进.不希望能学的有多么高深,只希望在一些最基本的算法上有编码的思路,或 ...
- 每天5分钟玩转python3算法:二分查找法
从今天开始,博主准备开始一段常见算法的学习,算法实现使用Python3,希望坚持下去^_^ alg1:二分查找法 1.运行时间 二分查找相比于依次查找,查询速度提升明显: + 依次查找:O(n) + ...
- 经典算法之左边界二分查找法(俗称左边界二分搜索法)
经典算法之左边界二分查找法(俗称左边界二分搜索法) 文章目录 经典算法之左边界二分查找法(俗称左边界二分搜索法) 前言 一.什么左边界二分查找法? 二.代码实现 总结 前言 就算法而言,我们主要学习的 ...
最新文章
- 美国正在衰落的24个行业:“猝不及防”还是“温水煮青蛙”?
- CF B. Working out
- test case id - hash generation logic
- HDMI高清光端机产品特点及应用场合介绍
- 安装oracle到create inventory时卡住了怎么办_win10系统安装教程(官方工具)
- Java基础---分支结构(if--else / switch---case)
- 中断挂起是什么意思_深入JVM(三)- 什么是垃圾及垃圾回收算法
- python复习题答案_python的复习题和答案合集
- vue组件双向绑定.sync修饰符的一个坑
- 在delphi中嵌入脚本语言--(译)RemObjects Pascal Script使用说明(1)(译)
- 移动端适配的理解——REM方案
- 笔记本电脑频繁自动重启_电脑一直自动重启怎么办 电脑一直自动重启的原因和解决办法...
- 仙人掌相关问题的处理方法(未完待续)
- 针对车载系统相关的功能分析(车载OS、芯片、导航、DC、总线系统等)
- qt 飞扬青云_Qt编写安防视频监控系统(界面很漂亮)
- 实现以form-data参数发送post请求
- 塑化行业SCM供应链管理平台授信支付与供应链金融,轻松交易
- 聊聊关于复杂调查加权中权重对数据的分布影响
- Python实现:P5724 【深基4.习5】求极差 / 最大跨度值
- object-c陷阱
热门文章
- MediaStore.Images.Media.insertImage保存图片
- 照片做视频哪个软件好?简单但好用
- android组件化蘑菇街,蘑菇街 App 的组件化之路·续
- Arch下 OpenJDK shows intermittent performance and UI issues. We recommend using the Oracle JRE/JDK.
- 怎么校验一个数是否是素数(质数)以及如何更高效率的校验
- BAT打开一个URL网址
- Pandas的MultiIndex多层索引使用
- JavaScript实现POP窗体的onclose功能
- pytorch椎骨检测之分类模型
- go的滚咕噜咕噜滚和点心的龙卷风的实现原理