二分法,应该是所有算法里面最简单的,就是在一个有序数组中找一个数,非常简单。
但是最近捕捉到了一点细节,还是想用系统化的模型来总结总结。
二分法的基本用法:
(1)在一个无重有序数组中找一个确定的数,返回找到的下标
(2)在一个可重复的有序数组中找一个确定的数,返回这个数出现的第一个下标
(3)在一个可重复的有序数组中找一个确定的数,返回这个数出现的最后一个下标
(4)结合(2)(3)可得,在一个可重复的有序数组中找一个确定的数,返回这个数出现的所有下标
然而,很多题目的二分法是这么用的:
我总结了一下,基本二分法是在一个显式数组中找到一个确定的数,
而很多时候,我们是要求满足某种条件的最大的数,所以我们搜索的对象是隐式的解空间数组,搜索的目标就是我们的答案。
理解了这个差异,二分法的题目应该都能想到二分了。
搜索解空间数组的时间复杂度是O(T* logJ),其中T是单点验证时间,J是解空间的大小。
一般如果我们能在10^6次计算内完成单点验证,就不会超时。