ruby中二进制搜索算法的问题

时间:2011-03-03 20:50:25

标签: ruby arrays binary-search

def binarysearch(a, b,  tofind, stringarray)
  k=(a+b)/2
  if a==b
    return nil
  end
  if (stringarray[k]).include? tofind
    return stringarray[k]
  end
  if (stringarray[k]<=>tofind)==1
    binarysearch(a,k,tofind,stringarray)
  end
  if (stringarray[k]<=>tofind)==-1
    binarysearch(k,b,tofind,stringarray)
  end
  if (stringarray[k]<=>tofind)==0
    return stringarray[k]
  end
end

这是一种二进制搜索算法。 a和b是它正在处理的数组索引,tofind是它正在搜索的字符串,而stringarray是一个字符串数组。不幸的是,每次尝试运行此函数时,我都会收到以下语法错误:

undefined method `include?' for 1:Fixnum (NoMethodError)`

但这不是一个固定因素。我是Ruby的新手,所以我很容易错过一些明显的东西。有什么建议?

这是我声明stringarray的地方:( Netbeans说它是一个数组)

  strings=Array.new
  newstring=""
  until newstring=="no" do
    newstring=gets.chomp
    strings[strings.size]=newstring
  end

2 个答案:

答案 0 :(得分:5)

这会将二进制搜索添加到所有数组:

class Array
  def binarysearch(tf,lower=0,upper=length-1)
    return if lower > upper
    mid = (lower+upper)/2
    tf < self[mid] ? upper = mid-1 : lower = mid+1
    tf == self[mid] ? mid : binarysearch(tf,lower,upper)
  end
end

然后你可以像这样使用它:

(0..100).to_a.binarysearch(25)
=> 25
(0..100).to_a.binarysearch(-1)
=> nil

或者从头开始指定下限和上限:

(0..100).to_a.binarysearch(25, 50, 100)
=> nil

答案 1 :(得分:0)

传递给你的函数的stringarray实际上不是一个字符串数组,而只是一个简单的字符串。在字符串上使用[]方法返回给定位置的字符的字符代码,作为Fixnum;所以stringarray [k]返回字符串中位置k处字符的字符代码。正如错误所说,Fixnum没有include?

即使stringarray 是一个字符串数组,我也不确定为什么要与include?进行字符串比较。 include?用于查找数组中是否存在项目。要比较字符串,只需使用==