1

我在下面提供了测试用例,这只是一个激发我好奇心的问题。

ruby 文档Array#bsearch说:

“此方法返回第 i 个元素。如果 i 等于 ary.size,则返回 nil。”

这个解释还没有在我的脑海中点击。有人可以更深入地解释一下吗?

def greater_than_8(ary)                                                                        
  a = ary.bsearch { |x| x.to_f > 8 }                                                           
  a.nil? || a.to_f < 8 ? "No number greater than 8" : a                                        
end                                                                                            
                                                                                               
                                                                                               
ary = [0, 4, 7, 10, 12]                                                                        
puts greater_than_8(ary)                                                                       
#=> 10                                                                                         
                                                                                               
# Shouldn't this return 14?                                                                    
ary = [14, 3, 7]                                                                               
puts greater_than_8(ary)                                                                       
#=> "No number greater than 8" 

# THERE IT IS!                                                                
ary = [14, 13, 7]                                                                               
puts greater_than_8(ary)
#=> 14
                                                                                               
ary = [8, 8, 8, 8]                                                                             
puts greater_than_8(ary)                                                                       
#=> "No number greater than 8"                                                                 
                                                                                               
ary = [8.01, 123]                                                                              
puts greater_than_8(ary)                                                                       
#=> 8.01  

ary = ["one hundred", "151", "120", 9]                                                         
puts greater_than_8(ary)                                                                       
#=> 151
4

2 回答 2

1

欢迎来到堆栈溢出!二分查找的前提条件是要查找的列表必须经过排序,[14, 3, 7]而不是排序。在排序后的版本 ( ) 上调用您的函数[3, 7, 14]应该会产生您期望的结果。

数组的元素相对于块必须是单调的(或排序的)。

于 2020-11-12T23:26:49.697 回答
0

部分文档Array#bsearch是以下要求:

您可以在两种模式下使用此方法:find-minimum 模式和 find-any 模式。在任何一种情况下,数组的元素都必须相对于块是单调的(或排序的)。

在您的示例中,您使用的是 find-minimum 模式。从那里我们查看您使用的一些输入,看看它们是否单调。

# Monotone increasing, allowed
ary = [0, 4, 7, 10, 12]                                                                        

# Not monotone, not allowed                                                                                            
ary = [14, 3, 7]                                                                               

# Monotone decreasing, allowed
ary = [14, 13, 7]                                                                               
于 2020-11-12T23:34:20.657 回答