繁体   English   中英

Ruby 中奇怪的二分搜索行为

[英]Weird binary search behavior in Ruby

我正在尝试从头开始在 Ruby 中实现递归二进制搜索。

这是我的代码:

class Searcher

    def get_limits(array)
        [0, array.length - 1]
    end
    
    def binary_search_recursive(array, key)

        low, high = get_limits(array)
    
        mid = (low + high) / 2
    
        return -1 if low > high
    
        return binary_search_recursive(array[low, mid-1], key) if (array[mid] > key)
    
        return binary_search_recursive(array[mid+1, high], key) if (array[mid] < key)
    
        return mid if (array[mid] == key)
    
    end
    
end     

arr = [1,3,4,12,16,21,34,45,55,76,99,101]
key = 34
s = BinarySearch.new
index = s.binary_search_recursive(arr, key)
puts index

当我将'key'设置为 21 时,它奇怪地给了我正确的预期答案,即索引 5。可以说,当'key' = 3 时,我也得到了正确的答案,但我怀疑这是偶然的。

你看,每当 'key',= 21 或 3 时,我会为数组的每个元素得到 -1、0. 1 或 2? 我到底做错了什么?

我尝试了几种在网上找到的不同递归二进制搜索版本,这只是最近的一个。 我觉得我每次都遇到同样的问题?

这是我编辑我的问题后你所要求的。 代码的问题是您要拆分为新数组,因此 34 是该数组最后的唯一元素,因此索引为 0。

class Searcher
    def binary_search(array, val, low=0, high=(length - 1))
        return nil if high < low
        mid = (low + high) >> 1
        case val <=> array[mid]
          when -1
            binary_search(array, val, low, mid - 1)
          when 1
            binary_search(array, val, mid + 1, high)
          else mid
        end
     end
end     

arr = [1,3,4,12,16,21,34,45,55,76,99,101]
key = 34
s = Searcher.new
index = s.binary_search(arr, key, 0, arr.length)
puts index

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM