Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby无限循环插值搜索的实现_Ruby_Binary Search_Linear Interpolation - Fatal编程技术网

Ruby无限循环插值搜索的实现

Ruby无限循环插值搜索的实现,ruby,binary-search,linear-interpolation,Ruby,Binary Search,Linear Interpolation,我刚刚学会了如何进行插值搜索,但在Ruby上实现时遇到了一些问题。我一直有无穷多个循环,下界或上界都接近搜索的数字,但下界不触及方法退出条件的上界 def存在?(id) 下限=0 上限=$employee_list.length-1 而低音 如果lower等于upper,run为0,然后除以0 代码中没有退出条件。没有理由低于高于的原因,所以它会无限循环 解决方案 我将您的代码和前面提到的代码混合在一起,似乎效果不错: def exist?(array, key) lower = 0

我刚刚学会了如何进行插值搜索,但在Ruby上实现时遇到了一些问题。我一直有无穷多个循环,下界或上界都接近搜索的数字,但下界不触及方法退出条件的上界

def存在?(id)
下限=0
上限=$employee_list.length-1
而低音
  • 如果
    lower
    等于
    upper
    run
    为0,然后除以0

  • 代码中没有退出条件。没有理由
    低于
    高于
    的原因,所以它会无限循环

解决方案 我将您的代码和前面提到的代码混合在一起,似乎效果不错:

def exist?(array, key)
  lower = 0
  upper = array.length - 1
  while array[upper] != array[lower] && key >= array[lower] && key <= array[upper]
    middle = lower + ((key - array[lower]) * (upper - lower) / (array[upper] - array[lower]))
    if key > array[middle]
      lower = middle + 1
    elsif key < array[middle]
      upper = middle - 1
    else
      return true
    end
  end
  key == array[lower]
end

exist?($employee_list, id)
def存在?(数组,键)
下限=0
上限=数组长度-1
而数组[上]!=数组[下]&键>=数组[下]&键数组[中间]
下=中+1
elsif键<数组[中间]
上=中-1
其他的
返回真值
结束
结束
键==数组[下]
结束
是否存在?($employee_list,id)

您也可以返回索引或
nil
而不是
true
false

是否已排序
$employee\u list
是!你的代码也能工作!谢谢我是否可以将
键==array[lower]
替换为
return false
?还有,有没有比插值搜索更快的算法?对于一个包含一百万个元素的数组,我的代码大约运行2秒。还有一些人在半秒钟内就完成了,我想知道他们在使用什么算法。我不确定是否要删除
key==array[lower]
。我尝试使用一个大数组并查找每个元素,但找不到任何位置
key==array[lower]
。不过,我不确定我测试了所有的可能性。当值在数组中均匀分布时,插值搜索效果最佳。而且,可能更快,因为它是用C编写的。