参考文章:An almost optimal algorithm for unbounded searching
有一个函数 F : N + ↦ { X , Y } F: \N^+\mapsto \{X,Y\} F:N+↦{X,Y}
F ( j ) = { X j < n Y j ≥ n F(j)={Xj<nYj≥n F(j)={XYj<nj≥n
其中 n n n 为未知整数,求 n n n
依次测试 F ( 1 ) F(1) F(1), F ( 2 ) F(2) F(2), F ( 3 ) F(3) F(3),……,直到 F ( n ) = Y F(n)=Y F(n)=Y
查找次数 C B 0 ( n ) = n C_{B_0}(n)=n CB0(n)=n
对 i = 1 , 2 , 3 , . . . i=1, 2, 3, ... i=1,2,3,... ,依次测试 F ( 2 i − 1 ) F(2^i-1) F(2i−1) ,直到 F ( 2 m − 1 ) = Y F(2^m-1)=Y F(2m−1)=Y ( [ lg n ] + 1 [\lg n]+1 [lgn]+1 次)( m = [ lg n ] + 1 m=[\lg n]+1 m=[lgn]+1)
此时可知 2 m − 1 ≤ n ≤ 2 m − 1 2^{m-1}\le n\le 2^m-1 2m−1≤n≤2m−1,再进行二分查找( [ lg n ] [\lg n] [lgn] 次)
查找次数 C B 1 ( n ) = 2 [ lg n ] + 1 C_{B_1}(n)=2[\lg n]+1 CB1(n)=2[lgn]+1
令 F 1 ( i ) = F ( 2 i − 1 ) F_1(i)=F(2^i-1) F1(i)=F(2i−1) ,用 B1 算法查找到 m m m( 2 [ lg ( [ lg n ] + 1 ) ] + 1 2[\lg([\lg n]+1)]+1 2[lg([lgn]+1)]+1 次)
再进行二分查找( [ lg n ] [\lg n] [lgn] 次)
查找次数 C B 2 ( n ) = [ lg n ] + 2 [ lg ( [ lg n ] + 1 ) ] + 1 C_{B_2}(n)=[\lg n]+2[\lg([\lg n]+1)]+1 CB2(n)=[lgn]+2[lg([lgn]+1)]+1
C B k ( n ) = [ lg n ] + C B k − 1 ( [ lg n ] + 1 ) C_{B_k}(n)=[\lg n]+C_{B_{k-1}}([\lg n]+1) CBk(n)=[lgn]+CBk−1([lgn]+1)
要依据 n n n 的大小选择合适的 k k k, k k k 的规模接近 lg ∗ n \lg^*n lg∗n
可以应用到一侧边界已知,另一侧边界未知(或与期望规模相差较大)的情况下,这样比二分查找的效率高