#### 时间复杂度
-二分查找的最优时间复杂度为$O(1)$。
+二分查找的最优时间复杂度为 $O(1)$ 。
-二分查找的平均时间复杂度和最坏时间复杂度均为$O(\log n)$。因为在二分搜索过程中,算法每次都把查询的区间减半,所以对于一个长度为 $n$ 的数组,至多会进行 $O(\log n)$ 次查找。
+二分查找的平均时间复杂度和最坏时间复杂度均为 $O(\log n)$ 。因为在二分搜索过程中,算法每次都把查询的区间减半,所以对于一个长度为 $n$ 的数组,至多会进行 $O(\log n)$ 次查找。
#### 空间复杂度
-迭代版本的二分查找的空间复杂度为$O(1)$。
+迭代版本的二分查找的空间复杂度为 $O(1)$ 。
-递归(无尾调用消除)版本的二分查找的空间复杂度为$O(\log n)$。
+递归(无尾调用消除)版本的二分查找的空间复杂度为 $O(\log n)$ 。
### 代码实现
### STL 的二分查找
-C++ 标准库中实现了查找首个不小于给定值的元素的函数 [`std::lower_bound`](https://zh.cppreference.com/w/cpp/algorithm/lower_bound)和查找首个大于给定值的元素的函数 [`std::upper_bound`](https://zh.cppreference.com/w/cpp/algorithm/upper_bound),二者均定义于头文件 `<algorithm>` 中。
+C++ 标准库中实现了查找首个不小于给定值的元素的函数 [ `std::lower_bound` ](https://zh.cppreference.com/w/cpp/algorithm/lower_bound) 和查找首个大于给定值的元素的函数 [ `std::upper_bound` ](https://zh.cppreference.com/w/cpp/algorithm/upper_bound) ,二者均定义于头文件 `<algorithm>` 中。
二者均采用二分实现,所以调用前必须保证元素有序。
解题的时候往往会考虑枚举答案然后检验枚举的值是否正确。若满足单调性,则满足使用二分法的条件。把这里的枚举换成二分,就变成了“二分答案”。
???+note "[Luogu P1873 砍树](https://www.luogu.com.cn/problem/P1873)"
- 伐木工人米尔科需要砍倒M米长的木材。这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林。不过,米尔科只被允许砍倒单行树木。
+ 伐木工人米尔科需要砍倒 M 米长的木材。这是一个对米尔科来说很容易的工作,因为他有一个漂亮的新伐木机,可以像野火一样砍倒森林。不过,米尔科只被允许砍倒单行树木。
米尔科的伐木机工作过程如下:米尔科设置一个高度参数H(米),伐木机升起一个巨大的锯片到高度H,并锯掉所有的树比H高的部分(当然,树木不高于H米的部分保持不变)。米尔科就行到树木被锯下的部分。
## 分数规划
-参见:[分数规划](../misc/frac-programming.md)
+参见: [分数规划](../misc/frac-programming.md)
分数规划通常描述为下列问题:每个物品有两个属性 $c_i$ , $d_i$ ,要求通过某种方式选出若干个,使得 $\frac{\sum{c_i}}{\sum{d_i}}$ 最大或最小。