eine sehr geringe Korrektur hielsnoppe's answer:
In einem n
-Glied array (n > 0
), das Element zu vergleichen, ist bei Index m = floor((n-1)/2)
. So gibt es drei Möglichkeiten
A[m] < K
, dann nach einem Vergleich geht die Suche in einem n-1-m = ceiling((n-1)/2)
-elementigen Array.Die Suche wird dann nach zwei Vergleichen in einem m
-Element-Array fortgesetzt.
A[m] == K
, dann sind wir nach zwei Vergleichen fertig.
Wenn wir also den maximalen (worst-case) Anzahl von Vergleichen für eine Suche in einem n
-elementigen Array von C(n)
bezeichnen, haben wir
C(0) = 0
C(n) = max { 1 + C(ceiling((n-1)/2), 2 + C(floor((n-1)/2) }, n > 0
Für ungerade n = 2k+1
, Boden und Decke sind identisch, so offenbar die letztere das Maximum ist,
C(2k+1) = 2 + C(k)
und sogar n = 2k
finden wir
C(2k) = max { 1 + C(k), 2 + C(k-1) }.
Für n = 2
, dass beschließt zu C(2) = 1 + C(1) = 1 + 2 = 3
, für alle größeren sogar n
ist die maximale 2 + C(k-1)
, da für n >= 1
wir C(n) <= C(n+1) <= C(n) + 1
haben.
die Rekursion für die ersten paar n
auswerten, finden wir
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
So durch Induktion wir
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)
oder
C(n) = 2*log2(n+1) + floor(2*(n+1)/(3*2^floor(log2(n+1)))).
Dies ist eine exakte Obergrenze beweisen.
Es gibt einen Fehler in Ihrem Code: 'wenn K> A [m] dann zurück l ← m + 1 'sollte' wenn K> A [m] dann l ← m + 1' ohne die 'Rückkehr 'sein. – Gumbo