In dem Artikel http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=binarySearch diskutiert der Autor binäre Suche. Er unterscheidet zwischen dem Finden des niedrigsten Wertes, wo etwas wahr ist, und dem höchsten Wert, wo etwas falsch ist. Das Array sieht durchsucht so etwas wie:Unterschied zwischen der grundlegenden binären Suche nach Ober- und Untergrenze?
false false false true true
Ich bin neugierig, warum diese beiden Fälle unterschiedlich sind. Warum kannst du nicht einfach den niedrigsten Wert finden, der wahr ist, dann subtrahierst du eins, um den höchsten Wert zu finden, der falsch ist?
Edit2: Ok, also verstehe ich untere gegen obere Grenze. Nun, ich habe Mühe zu verstehen, wenn wir nach der kleinsten Ganzzahl größer oder gleich der Abfrage suchen, warum können wir nicht einfach die if(mid>query)
zu if(mid>=query)
ändern und es tun, anstatt Obergrenze zu tun.
Edit: Hier ist, was der Artikel heißt es:
„Jetzt endlich kommen wir zu dem Code, der wie in diesem und dem vorhergehenden Abschnitt beschrieben binäre Suche implementiert:
binary_search(lo, hi, p):
while lo < hi:
mid = lo + (hi-lo)/2
if p(mid) == true:
hi = mid
else:
lo = mid+1
if p(lo) == false:
complain // p(x) is false for all x in S!
return lo // lo is the least x for which p(x) is true
...
Wenn wir das letzte x finden wollten, für das p (x) falsch ist, würden wir (unter Verwendung eines ähnlichen Grundprinzips wie oben) etwas wie:
binary_search(lo, hi, p):
while lo < hi:
mid = lo + (hi-lo+1)/2 // note: division truncates
if p(mid) == true:
hi = mid-1
else:
lo = mid
if p(lo) == true:
complain // p(x) is true for all x in S!
return lo // lo is the greatest x for which p(x) is false
. "
Nun, ich nehme an, dass die binäre Suche impliziert, dass das Set so etwas wie ** false .... false true ... true ** egal was –
Der Artikel bezieht sich auf, dass dies der Fall ist, wenn wir sind Durchführen einer binären Suche; Ich glaube, das ist auch eine Notwendigkeit für die binäre Suche, um sogar auf die Situation anzuwenden. –
@ DietmarKühl sicher, aber könnten Sie nicht einfach überprüfen, dass mit wie 'if (lo == 0 && funktioniert (lo) == wahr) return false? –