90%的程序员都写错的算法-二分查找万能模版
新的角度看二分
- 二分就是将数组分为两段
- 因此,问题的最终目标是找出蓝红边界
朴素算法
- 红色指针一开始指向最右超出范围处,随后不断向左移动,直到找到蓝红边界;或者蓝色指针…
- 时间复杂度O(n)O(n)O(n)
二分查找
- 红蓝指针的移动其实代表着红蓝区域的拓展。那么,有什么更快拓展的方式呢?由于数组本身有序…便可以快速拓展红色 或 蓝色区域
- 数组下标有效范围[0,n−1][0,n - 1][0,n−1],因此,初始时
l = -1, r = n;
- 循环的结束条件是
l + 1 != r
,因为l指向蓝色边界最右边,r指向红色边界最左边,当l + 1 == r时整个数组已经由灰色未知被划分完毕 - 如果m是红色区域,直接
r = m
;同理… - 最后结果返回l还是r要看情况
细节1.为什么l的初始值为-1,r的初始值为n
- 假如最终整个数组都该是红色区域,如果l初始化为0,l一开始就处在红色区域内,这会造成错误;同理…
细节2.m是否始终处于[0,n)以内
- 只有处在这个区间以内,m才是有意义的
- 先看m的下界,由于
m = (l + r) / 2
(向下),因此如果我们想让m尽可能小,就要l和r尽可能小,l的最小值是初始值-1,r如果能进入循环体,最小值是1(不是0),因此m最小值为0 - 再看m上界,同理,r的最大值为n,l如果要进入循环体,最大值为n - 2,因此m最大值为n - 1
细节3.更新指针时,能不能写成l = m + 1或者r = m - 1
- 如果刚好m指向蓝色区域的最后一个位置,l如果变为m + 1,就错了;同理…
细节4.会不会陷入死循环
- 分别考虑
l + 1 == r
l + 2 == r
l + 3 == r
的情况 l + 1 == r
,退出循环l + 2 == r
,也就是它们之间隔一个元素,当进入循环体时,m就是它们之间隔着的那个元素,接下来,要么将l设置成m,要么将r设置成m,也就是说,在循环体结束时,l的下一个元素一定是r,会回归到第一种情况并退出循环体l + 3 == r
,会回归到第二种情况或者回归到第一种情况
例子 与 c++库函数
- lower_bound对应大于等于
- upper_bound对应大于
一般流程
- 后处理指的是 例如 只有蓝色区域/红色区域的返回值处理问题(需要特判)等
如果没有蓝色区域或者红色区域
- 那么l或者r会不在有效范围内
- 最后结果特判,l的初始值为-1,r的初始值为n
浮点数的二分
- 题目 :通过二分查找的方式计算2\sqrt{2}2,要求误差小于10−610^{-6}10−6
- 退出循环的条件为
r - l <= 1e-8
- 要求误差小于10−610^{-6}10−6,相当于 结果保留6位小数;这样,循环退出的条件是10−810^{-8}10−8,而输出则是六位小数
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{double l = -10000, r = 10000;while (r - l > 1e-8){double mid = (l + r) / 2;if (mid * mid >= 2) r = mid;else l = mid;}
// printf("%.6lf\n", l);cout << fixed << setprecision(6) << l << endl;return 0;
}
90%的程序员都写错的算法-二分查找万能模版相关推荐
- 毕业之后,这些年薪 50w+ 的 90 后程序员都经历了什么?纯水贴
毕业之后,这些年薪 50w+ 的 90 后程序员都经历了什么? 即使是处于薪资链顶端的程序员,年薪(不含期权.股票等)超过 50 万,对他们而言也并不是一件容易事.就招聘平台 100offer 而言, ...
- 技术与市场脱钩?90%的程序员都错了!
面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...
- 技术不够硬?90%的程序员都错了!
面对日新月异的技术潮流,怎样才能避免沦为与市场脱钩.甚至被无情清退的大龄码农?很多程序员都走了弯路! 安于现状,对于学习新技术这件事有些抵触: 一再拖延,身边的同事新框架玩的飞起,自己却懒于行动: 盲 ...
- 年薪50万+的90后程序员都经历了什么?
[文章来源微信公众号:每天学编程] 薪资是检验一家公司对你认可的标准,能达到年薪 50 万+,一定程度上说明了公司对你创造的价值的认可. 即使是处于薪资链顶端的程序员,年薪(不含期权.股票等)超过 5 ...
- 100%的程序员都想挑战的算法趣题!| 码书
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- 我敢打赌,这是98%的程序员都想挑战的算法趣题!
计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,"算法" ...
- 100% 的程序员都想挑战的算法趣题!
作者 | 图小敏 计算机的世界每天都在发生着深刻的变化.新操作系统的发布.CPU性能的提升.智能手机和平板电脑的流行.存储介质的变化.云的普及--这样的变化数不胜数. 在这样日新月异的时代中,&quo ...
- 90%的程序员都答不完的趣味题,答完领“神兵”!
你是程序员?或者说你有朋友是程序员?快来看看我精心准备的几道送命题,测测你的级别在哪个阶段.哈哈哈哈! 玩法: 本次总共分三个模式,简单.一般和困难模式,每个模式只有3-4个小题,逐个回答,每个模式打 ...
- 为什么优秀的程序员都写博客?谈谈我都是如何写作的
我的文章上热榜啦 首先在写之前给大家分享个歌单1 ,歌单二,分享歌单呢,主要是我在哔哩哔哩剪辑视频加的,我写东西不会去听音乐的,因为觉得那样,不利于 我的思维扩展. 进入正题 写博客呢首先要知道它具有 ...
最新文章
- xgboost源码 要看的
- svn更改用户名方法:
- ML之DTRFRExtraTRGBR:基于四种算法(DT、RFR、ExtraTR、GBR)对Boston(波士顿房价)数据集(506,13+1)进行价格回归预测并对比各自性能
- C++ Primer 5th笔记(chap 16 模板和泛型编程)定义
- java对象在内存中的布局
- Oracle Recyclebin
- 2018.9.19.Matlab实验四:Matlab程序设计
- RTT的线程同步篇——总结
- NumPy Cookbook 带注释源码 十、Scikit 中的乐趣
- [转载] Python字典及基本操作(超级详细)
- UE4之批量删除actor
- 取得系统当前日期和时间
- 不确定性,进化与经济理论
- 从小白到大咖——十分钟学会JavaScript操作浏览器内置对象
- pytoch 安装为Gpu版本
- 『开发技巧』全网最详尽手把手教你在Ubuntu安装搜狗输入法
- 计算机控制实验PID数字控制器设计,实验二数字PID控制器的设计
- 浅谈javascript注入攻击
- U盘无法格式化怎么办?!
- OpenCV 调用网络摄像头