2014-04-22 24 views
14

Ben Ruby 2.0.0 gibi dizi sınıfının test ettiğim bir bsearch yöntemine sahip olduğunu ve beklediğim davranışı alamadığımı fark ettim. Neden 2, 5, ancak -1, 1 ve 4 için nil için bir değer döndürüyor?Ruby 2.0.0 Array # bsearch Davranışı

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 

cevap

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 

İkili arama sonraki yineleme arama için seçilmelidir dizinin (sol veya sağ tarafına) bir parçasıdır bir ipucu olarak bloğun sonucunu kullanır. Blok 0 değerini döndürürse, aramayı durdurur. o sola git edecektir 0 daha az dönerse, aksi takdirde doğru gider :)

burada

fazla bilgi http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-bsearch

Tamam UPD, senin örnek

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

İlk alalım orta elemanı (2) alıp bloğa vereceğiz. 2 == 3, false'u döndürecek, bu nedenle dizinin sağ tarafına doğru hareket ediyoruz.

Biz 5 olduğunu [4, 5] ve 5 == 3 orta elemanı false

sağda Hiçbir unsurlar yoktur edilir almak, bu yüzden nil

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

İlk 2 == 2true olduğunu dönecektir. Sola gideriz. [-1, 1]'un orta elemanı 1 1 == 2 ise false şeklindedir. Biz sağa gideriz.

Orada sağ 1'e [-1, 1] hiçbir herhangi unsurlar, bu yüzden 2

PS olduğunu true deyimi döndürülen son son öğe dönmek: dizi sıralanması gerektiğini, unutmayın;)

+0

Bulma minimum modunda * ne olduğunu açıklamalısınız *? OP'nin örnekleri bununla ilgilidir. –

+0

@ArupRakshit Her ne kadar yazar onu bulmak hakkında soru sorsa da öyle değil mi? Bu yazı işlerinde ben öyle düşünmüyorum – fl00r

+0

.. –

1

Ben daha sezgisel Sadece uzay sağındaki x koymak emin olun uzay operatörü

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

kullanmak bulabilirsiniz.

Bu aynı zamanda dizeleri ve <=> ile karşılaştırılabilir herhangi bir nesne için çalışır.