繁体   English   中英

ruby 中的递归二分查找

[英]recursive binary search in ruby

我一直在学习一些算法,但我找不到我的方法失败的原因。 如果您可以查看代码并了解为什么会发生这种情况。 我真的很感激。

我正在尝试编写一种方法来递归地对数组进行二进制搜索,到目前为止,这就是我的全部代码。

 def recursive_binary_search(arr, target)
   max_index = arr.length - 1
   mid_index = max_index / 2

   if arr[mid_index] > target
     new_arr = arr[0..(mid_index - 1)]
     recursive_binary_search(new_arr, target)
   elsif arr[mid_index] < target
     new_arr = arr[(mid_index + 1)..max_index]
     recursive_binary_search(new_arr, target)
   else
     return mid_index
   end
 end

我不断收到的错误是undefined method '>' for nil:NilClass

我无法重现 OP 报告的异常(因为问题中没有给出产生异常的数据),但主要问题是,因为max_index是从arr计算的,而arr不断变小,索引方法返回的值与初始数组arr的正确索引无关。

例如,假设arr = [1,2,3,4,5,6]target = 6 在这种情况下,该方法将返回0 (而不是5 )作为目标元素的索引。 这是因为arr将逐渐变为arr[3..6]arr[4..6]arr[5..6]arr[6] ,此时将返回索引0

这是使用case语句编写方法的一种方式。 该方法假设targetarr一个元素,并且(根据二分搜索的要求) arr的元素是有序的,从最小到最大。

def recursive_binary_search(arr, target, min_index=0, max_index=arr.size-1)
  mid_index = (min_index+max_index)/2
  case arr[mid_index] <=> target
  when  0  # arr[mid_index] == target
    mid_index
  when -1  # arr[mid_index] < target
    min_index = mid_index + 1
    recursive_binary_search(arr, target, min_index, max_index)
  when  1  # arr[mid_index] > target
    max_index = mid_index - 1
    recursive_binary_search(arr, target, min_index, max_index)
  end
end

arr = [1,2,3,4,5,6]

arr.each { |target| puts "#{target}: #{recursive_binary_search(arr, target)}" }
1: 0
2: 1
3: 2
4: 3
5: 4
6: 5

如果您的数组已排序,您可以尝试这样的操作:

def search(arr, target)
 return nil if array.empty?
 
 mid_index = array.length / 2

 case target <=> array[mid_index]
 when -1
   search(array.take(mid_index), target)
 when 0
   mid_index
 when 1
   subs = search(array.drop(mid_index + 1), target)
   subs.nil? ? nil : (mid_index + 1) + subs
 end

end

暂无
暂无

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

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