2014-04-22 9 views
14

Ich bemerkte, dass ab Ruby 2.0.0 die Array-Klasse eine bsearch-Methode hat, die ich getestet habe und ich bekomme nicht das Verhalten, das ich erwarten würde. Warum gibt es einen Wert für 2 und 5 zurück, aber nil für -1, 1 und 4?Ruby 2.0.0 Array # bsearch Verhalten

arr_in = [-1, 1, 2, 4, 5] 

arr_in.bsearch { |x| x == 3 } #=> nil 
arr_in.bsearch { |x| x == -1 } #=> nil 
arr_in.bsearch { |x| x == 1 } #=> nil 
arr_in.bsearch { |x| x == 2 } #=> 2 
arr_in.bsearch { |x| x == 4 } #=> nil 
arr_in.bsearch { |x| x == 5 } #=> 5 

Antwort

24
arr_in = [-1, 1,2,4,5] 
arr_in.bsearch{ |x| 2 - x } 
#=> 2 
arr_in.bsearch{ |x| -1 - x } 
#=> -1 
arr_in.bsearch{ |x| 3 - x } 
#=> nil 

Binäre Suchergebnis verwendet Blockade als Hinweis, die einen Teil des Arrays (links oder rechts) sollte für die Suche auf der nächsten Iteration gewählt werden. Wenn Block 0 zurückgibt, wird die Suche beendet. Wenn es gibt weniger als 0 wird es sonst gehen Sie nach links geht es rechts :)

Weitere Informationen hier http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-bsearch

UPD

Ok, lassen Sie uns Ihr Beispiel

arr_in = [-1, 1, 2, 4, 5] 
arr_in.bsearch { |x| x == 3 } 

Erste Wir nehmen das mittlere Element (2) und geben es dem Block. 2 == 3 wird false zurückgeben, so dass wir auf die rechte Seite des Arrays gehen.

Wir nehmen mittlere Element von [4, 5] die 5 und 5 == 3 ist false

gibt es keine keine Elemente auf der rechten Seite, so werden wir nil

arr_in = [-1, 1, 2, 4, 5] 
arr_in.bsearch { |x| x == 2 } 

Erste 2 == 2true zurückzukehren. Wir gehen nach links.

Mittleres Element von [-1, 1] ist 1. 1 == 2 ist false. Wir gehen nach rechts.

Es gibt keine alle Elemente in [-1, 1] Recht auf 1, so dass wir zurückkehren letztes letztes Element, die true Anweisung zurückgegeben, die 2

PS: vergessen Sie nicht, dass das Array sortiert werden soll;)

+0

Sie sollten erklären, was passiert * im Find-Minimum-Modus *? Die Beispiele von OP beziehen sich darauf. –

+0

@ArupRakshit Ich, obwohl Autor fragt nach-alle, nicht wahr? – fl00r

+0

Ich glaube nicht .. –

1

ich finde es intuitiver das Raumschiff schiff~~POS=HEADCOMP Betreiber

array.bsearch {|x| 3 <=> x } 

einfach zu verwenden, stellen sie sicher, die x rechts von dem Raumschiff schiff~~POS=HEADCOMP zu setzen.

Dies funktioniert auch für Strings und jedes Objekt, das mit <=> vergleichbar ist.