2014-04-22 18 views
14

Tôi nhận thấy rằng như của Ruby 2.0.0 lớp mảng có một phương pháp bsearch mà tôi đã thử nghiệm và tôi không nhận được hành vi tôi mong đợi. Tại sao nó trả lại giá trị cho 2 và 5 nhưng nil cho -1, 1 và 4?Ruby 2.0.0 Array # bsearch behavior

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 

Trả lời

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 

tìm kiếm nhị phân sử dụng kết quả khối như một gợi ý mà một phần của mảng (trái hoặc bên phải) nên được lựa chọn để tìm kiếm trên phiên bản kế tiếp. Nếu khối trả về 0 nó sẽ ngừng tìm kiếm. Nếu nó trả ít hơn 0 nó sẽ đi lại nếu không nó đi đúng :)

biết thêm thông tin ở đây http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-bsearch

UPD

Ok, chúng ta hãy lấy một ví dụ của bạn

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

Đầu tiên chúng ta sẽ lấy phần tử trung gian (2) và mang nó đến khối. 2 == 3 sẽ trả về false, vì vậy chúng tôi di chuyển sang bên phải của mảng.

Chúng tôi có yếu tố giữa [4, 5] đó là 55 == 3 được false

Không có bất kỳ yếu tố ở bên phải, vì vậy chúng tôi sẽ trở lại nil

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

Đầu tiên 2 == 2true. Chúng tôi đi bên trái.

Phần tử ở giữa [-1, 1] là 1. 1 == 2false. Chúng tôi đi bên phải.

Không có bất kỳ yếu tố trong [-1, 1] quyền 1, vì vậy chúng tôi trở lại yếu tố cuối cùng cuối cùng mà trở true tuyên bố đó là 2

PS: đừng quên, mà mảng nên được sắp xếp;)

+0

Bạn nên giải thích điều gì đã xảy ra * ở chế độ tìm tối thiểu *? Như các ví dụ của OP có liên quan đến điều này. –

+0

@ArupRakshit Tôi mặc dù tác giả đang hỏi về tìm-bất kỳ, phải không? – fl00r

+0

Tôi không nghĩ vậy .. –

1

tôi thấy nó trực quan hơn để sử dụng các nhà điều hành tàu vũ trụ

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

Chỉ cần chắc chắn để đưa x ở bên phải của tàu vũ trụ.

Điều này cũng hoạt động đối với chuỗi và bất kỳ đối tượng nào có thể so sánh với <=>.