算法导论——二分

Victory_Defeat

2018-08-28 13:53:53

Personal

二分是一种**极其简单并且常见的算法**,它的目的是为了**在有序的数列中快速找到符合某个条件的最大或最小值**(注意:必须有序) 为什么说是**快速**呢?因为二分的 **时间复杂度是$O \left ( \log_2 n \right )$,而顺序查找则是$O \left ( \dfrac{n}{2} \right )$**,所以,二分显然快于顺序查找。(注:这是在$check$函数为$O \left ( 1 \right )$的情况下) 二分写法**多的要死**,这里只写一种: ```cpp while(l<r) { m=(l+r)/2; if(check(m))l=m+1; else r=m; } ``` (注:l为左边界,r为右边界,m为中间,check依据题目而定) 二分有两大类:**二分查找、二分答案** 二分查找是指**用二分查找一个下标**,二分答案则是**用二分查找一个值**,这是两者的区别 一般来说,**第二种**,也就是二分答案用的要多一些,但是**在导弹拦截中用的是二分查找** [这题](https://www.luogu.org/problemnew/show/P2855)就是一道经典的二分答案题,重点就在check函数上 二分最难的并不是背板子,而是**写出正确的、复杂度低的check函数** 虽然二分的复杂度最多是$O \left ( 32*f \left ( check \right ) \right )$,但是如果**check函数复杂度过大**,那么,二分也无能为力 二分是一种简单而又好用的算法,但是请注意:**前提条件是有序!!!**