- gf24240 的博客
《梦溪笔谈·C++》卷二十三:二分
- 2025-5-31 11:24:37 @
背景
其实再之前就有过这篇blog了,不过写得不好。之前用的是D老师的代码。现在重写一篇,为纪念七年级下册期末考前的最后一节线上课。
二分包括很多内容。粗略可以分为二分查找(二分搜索)和二分答案。
0. 区间
在学二分前,要了解一个概念——区间。区间表示一个范围。区间分为4种:
- 前闭后闭
- 前闭后开
- 前开后闭
- 前开后开
(现在学了实数二分,终于接受了前开后开区间)
0-1. 前闭后闭
前闭后闭区间可以表示为 [l,r]
,包括 l
,包括 r
。
用这个区间写二分比较复杂,但狡猾的出题人就喜欢这种区间————因为他们喜欢学历史 (喜欢背书) 。
0-1. 前闭后开
前闭后闭区间可以表示为 [l,r)
,包括 l
,不包括 r
。
这种区间适合求最小值最大。
0-1. 前开后闭
前闭后闭区间可以表示为 (l,r]
,不包括 l
,包括 r
。
这种区间适合求最大值最小。
0-1. 前开后开
前闭后闭区间可以表示为 (l,r)
,不包括 l
,不包括 r
。
这种区间适合求实数二分(类似1型二分)。
1. 二分查找(二分搜索)
二分查找,可以理解为二分和查找。
好像二分搜索比二分查找更高大上亿些。不过它们的意思是相同的。即在在单调不下降序列中查找/第一个大于/大于等于/最后一个小于/小于等于/的数。前面的那句话有点长,整理一下就得到查找的分类:
种类 | 最大值最小 | 最小值最大 |
---|---|---|
普通 | 查找 | |
有= | ||
无= |
上面是查找的分类方式,那二分呢?当然就是按照上面的区间来分类。这里参考D老师的分类方法:
- 1型二分
- 0型二分
- -1型二分
结合一下,就可以得到二分查找的分类。