一個很小的校正hielsnoppe's answer:
在n
- 元素陣列(n > 0
),比較元件是在索引m = floor((n-1)/2)
。因此,有三種可能性
A[m] < K
,那麼一個比較後,搜索在n-1-m = ceiling((n-1)/2)
- 元素陣列繼續。
A[m] > K
,然後在兩次比較後,搜索繼續到m
-element數組中。
A[m] == K
,然後我們完成兩次比較後。
因此,如果我們表示的最大(最壞情況)的比較的數目用於在n
- 元素陣列的搜索通過C(n)
,我們有
C(0) = 0
C(n) = max { 1 + C(ceiling((n-1)/2), 2 + C(floor((n-1)/2) }, n > 0
對於奇數n = 2k+1
,地板和天花板的相同的,所以最大顯然是後者,
C(2k+1) = 2 + C(k)
和甚至n = 2k
,我們發現
C(2k) = max { 1 + C(k), 2 + C(k-1) }.
對於n = 2
,解析爲C(2) = 1 + C(1) = 1 + 2 = 3
,所有更大n
,最高2 + C(k-1)
,由於n >= 1
我們有C(n) <= C(n+1) <= C(n) + 1
。
評估前幾n
遞歸,我們發現
C(0) = 0
C(1) = 2
C(2) = 3
C(3) = C(4) = 4
C(5) = C(6) = 5
C(7) = C(8) = C(9) = C(10) = 6
C(11) = ... = C(14) = 7
C(15) = ... = C(22) = 8
C(23) = ... = C(30) = 9
因此,通過感應證明
C(n) = 2k, if 2^k <= n+1 < 2k + 2^(k-1), and
C(n) = 2k+1, if 2^k + 2^(k-1) <= n+1 < 2^(k+1)
或
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
這是一個確切的上限。
在你的代碼中有一個錯誤:'如果K> A [m],那麼返回l←m + 1'應該是'如果K> A [m],那麼l←m + 1'沒有'return'。 – Gumbo