首先列出二分查找最大次数的公式 |log2n|+1(|x|为不大于x的最大整数)
接下来谈一谈我的理解:
数组大小 查找的最大次数
1(2^ 0) 1
2(2^1) 2
4(2^2) 3
当数组大小为8时(a[0],a[1]…a[7]),(第一步)对半查找取a[3],之后数组划分为a[0],a[1],a[2]和a[4],a[5],a[6],a[7],因为我们要次数最大,因此自然在后者而不是前者中继续查找(毕竟4比3大)。(第二步)对a[4],a[5],a[6],a[7]这4个数进行对半查找,但是这种情况已在上面列出,对于4个长度的数组,我们最大查找次数为3.
(第三步)将第一步和第二步所进行的次数相加,1+3=4.
因此当数组长度为8时,查找的最大次数为4.
同理,数组长度为16时,对半查找一次后情况如同长度为8的数组,英雌查找的最大次数为4+1=5.
数组大小 查找的最大次数
由此可得 2^n n+1
讨论了基本情况之后,我们来讨论更复杂的情况
假设一个数x,2^n<x,
x<2^(n+1).
同样的操作,(第一步)进行对半查找,划分为两个数组,这是一次操作。(第二步)因为x<2^(n+1),所以划分所得到的两个数组,其中最大的一个数组一定小于
2^(n+1)/2,
即2^n,因此对其进行对半查找所需的操作次数一定小于n+1,因此等于n(此处假设公式 |log2n|+1成立,由公式 |log2n|+1推出次数等于n).
(第三步)将第一步和第二步的次数相加得1+n,所以x查找的最大次数与大小为2^n的数组相同,
可以得到
数组范围 查找的最大次数
2的n次方——2的(n+1)次方-1 n+1
也就是公式 |log2n|+1(|x|为不大于x的最大整数)。