coding笔记:二分算法
二分算法
整数二分
- 整数二分因为涉及+1,-1,所以为了防止死循环,需要考虑边界情况。
- 当我们定义一个性质,该性质可以将数据二分时(即存在边界时),二分算法是可以将该边界找出来的。
主要思想
- 假设在整个区间内部是可以找到答案的,我们对整个区间不断进行二分
- 每次都要选择答案所在的区间去进行下一步搜索(每次会把整个区间的大小缩小一半)
- 二分一定会保证区间里有答案的,但是存在特例,即原问题无解的情况(无解一定和题目有关)
- 在原问题无解的情况下,若没有遇到数组边界,找到的区间一定是满足条件的,但不是query;而如果遇到数组边界,那么就可能不会满足找到的区间一定是满足条件的(以整数的范围这道题为例)
该图即为寻找满足check的最右端端点示意图
上图对应的代码即为二分模板1的代码,如下所示:
1 | bool check(int mid) {return false;} |
浮点数二分
- 较整数二分简单,因为不需要考虑边界(因为没有整除,每次都可以完美地将边界缩小一半)
- 思想与整数二分一样,只要满足时时刻刻答案都在我们的区间即可;
- 但我们的区间足够小时,我们就可以认为已经找到了答案;
- 有两种方式可以去写浮点数二分的循环条件:一个是固定循环100次,如果原来区间长度为1时,结束时区间长度即为
;或是指定一个很小的数epsilon,当区间长度小于这个数即可退出。
1 | double fbsearch(double l,double r,double target){ |
应用:数的三次方根
求数的三次方根可以使用二分查找来做。因为函数
1 | double fbiSearch(double l, double r, double target, double (*pf)(double)) { |
简要介绍下引入的函数指针,有了函数指针就可以方便地将计算方法传入二分查找算法来找解。double (*pf)(double)=calTrip;
可以定义一个函数指针,非常有用。
- Post title:coding笔记:二分算法
- Post author:sixwalter
- Create time:2023-08-05 11:14:26
- Post link:https://coelien.github.io/2023/08/05/coding-solution/binarysearch/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.
Comments