【note】指数搜索

参考文章: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)=\begin{cases}X&jF(j)={XYj<njn

其中 n n n 为未知整数,求 n n n

算法

B0(顺序查找)

依次测试 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

B1(二分查找)

i = 1 , 2 , 3 , . . . i=1, 2, 3, ... i=1,2,3,... ,依次测试 F ( 2 i − 1 ) F(2^i-1) F(2i1) ,直到 F ( 2 m − 1 ) = Y F(2^m-1)=Y F(2m1)=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 2m1n2m1,再进行二分查找( [ 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

B2

F 1 ( i ) = F ( 2 i − 1 ) F_1(i)=F(2^i-1) F1(i)=F(2i1) ,用 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]+CBk1([lgn]+1)

要依据 n n n 的大小选择合适的 k k k k k k 的规模接近 lg ⁡ ∗ n \lg^*n lgn

应用

可以应用到一侧边界已知,另一侧边界未知(或与期望规模相差较大)的情况下,这样比二分查找的效率高

你可能感兴趣的:(草稿,算法)