这是类似于Michal的回答(我将从中借鉴美丽的图形)的思路。
矩阵:
min ..... b ..... c
. . .
. II . I .
. . .
d .... mid .... f
. . .
. III . IV .
. . .
g ..... h ..... max
Min和Max分别是最小值和最大值。"mid"不一定是平均/中位数/任何值。
我们知道mid的值>=象限II中的所有值,并且<=象限IV中的所有值。我们不能对象限I和III做出这样的断言。如果我们递归,我们可以在每个级别消除一个象限。
因此,如果目标值小于mid,则必须搜索象限I、II和III。如果目标值大于mid,则必须搜索象限I、III和IV。
每步空间减少了3/4:
n * (3/4)x = 1
n = (4/3)x
x = log4/3(n)
对数只相差一个常数因子,因此这是O(log(n))。
find(min, max, target)
if min is max
if target == min
return min
else
return not found
else if target < min or target > max
return not found
else
set mid to average of min and max
if target == mid
return mid
else
find(b, f, target), return if found
find(d, h, target), return if found
if target < mid
return find(min, mid, target)
else
return find(mid, max, target)