【问题标题】:Interpolation Search Implementation on Ruby Infinite LoopRuby无限循环上的插值搜索实现
【发布时间】:2017-01-23 07:14:56
【问题描述】:

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

def exist?(id)
	lower = 0
	upper = $employee_list.length - 1
	while lower <= upper
		rise = upper - lower
		run = $employee_list[upper] - $employee_list[lower]
		x = id - $employee_list[lower]
		middle = (rise.to_f / run.to_f * x.to_f + lower.to_f).floor
		if id == $employee_list[middle]
			return true
		elsif id < $employee_list[middle]
			upper = middle - 1
		else
			lower = middle + 1
		end
	end
end

【问题讨论】:

  • $employee_list 排序了吗?
  • 是的!而且您的代码有效!

标签: ruby binary-search linear-interpolation


【解决方案1】:

注意事项

  • 如果lower 等于upper,则run 为0,你除以0。

  • 您的代码中没有退出条件。没有理由lowerupper,所以它无限循环。

解决方案

我将您的代码和提到的here 混合在一起,它似乎工作正常:

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)

您也可以返回索引或nil,而不是truefalse

【讨论】:

  • 谢谢!我可以用return false 替换key == array[lower] 吗?另外,有没有比插值搜索更快的算法?对于具有一百万个元素的数组,我的代码运行时间约为 2 秒。还有其他人在半秒内完成了,我想知道他们使用的是什么算法。
  • 我不确定是否要删除key==array[lower]。我尝试使用一个大数组并查找每个元素,但找不到任何地方 key==array[lower]。不过,我不确定我是否测试了所有可能性。当值在数组中均匀分布时,插值搜索效果最佳。此外,ruby-doc.org/core-2.4.0/Array.html#method-i-bsearch 可能更快,因为它是用 C 编写的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多