2014-04-22 6 views
14

मैंने देखा कि रूबी 2.0.0 के रूप में सरणी वर्ग में bsearch विधि है जिसका मैं परीक्षण कर रहा था और मुझे वह व्यवहार नहीं मिल रहा है जिसकी मैं अपेक्षा करता हूं। यह -1, 5 और nil के लिए -1, 1, और 4 के लिए मान क्यों देता है?रूबी 2.0.0 ऐरे # bsearch व्यवहार

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 

उत्तर

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 

द्विआधारी खोज एक संकेत है जो सरणी (छोड़ दिया है या सही पक्ष) के हिस्से के अगले चरण पर खोज के लिए चुना जाना चाहिए के रूप में ब्लॉक के परिणाम का उपयोग करता है। यदि ब्लॉक 0 देता है तो यह खोजना बंद कर देगा। यह कम तो 0 रिटर्न छोड़ दिया जाने देंगे अन्यथा यह सही हो जाता है :)

यहाँ

अधिक जानकारी http://www.ruby-doc.org/core-2.1.1/Array.html#method-i-bsearch

युपीडी

ठीक है, के अपने उदाहरण

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

सबसे पहले लेते हैं हम मध्यम तत्व (2) लेंगे और इसे ब्लॉक में लाएंगे। 2 == 3false वापस करेगा, इसलिए हम सरणी के दाहिने तरफ जाते हैं।

हम [4, 5] जो 5 है और 5 == 3 के बीच तत्व ले false

सही पर कोई किसी भी तत्व नहीं है है, इसलिए हम वापस आ जाएगी nil

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

पहले 2 == 2true है। हम बाईं ओर जाते हैं।

[-1, 1] का मध्य तत्व 1. 1 == 2false है। हम दाईं ओर जाते हैं।

1 का अधिकार [-1, 1] में कोई किसी भी तत्व नहीं है, इसलिए हम पिछले पिछले तत्व जो true बयान जो है 2

पुनश्च लौटे वापसी: भूल नहीं है, कि सरणी सॉर्ट किया जाना चाहिए;)

+0

आपको समझाया जाना चाहिए कि * न्यूनतम मोड * में क्या हुआ *? चूंकि ओपी के उदाहरण इस से संबंधित हैं। –

+0

@ArupRakshit मैं हालांकि लेखक खोजने के बारे में पूछ रहा हूं, है ना? – fl00r

+0

मुझे ऐसा नहीं लगता .. –

1

मैं इसे अधिक सहज ज्ञान युक्त अंतरिक्ष यान ऑपरेटर

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

उपयोग करने के लिए बस अंतरिक्ष यान के अधिकार के लिए x रखना सुनिश्चित करें पाते हैं।

यह स्ट्रिंग्स और किसी ऑब्जेक्ट के लिए भी काम करता है जो <=> के साथ तुलनीय है।

संबंधित मुद्दे