2014-01-23 153 views
0

我正在开发一种二进制搜索算法来搜索字符串数组,但是,在我的搜索中的某个点“Canacee”的评估比按字母顺序比“administrate”低。有人知道为什么会发生这种情况吗? 我的代码:比较字符串在红宝石中的字符串出错

class Array 
def binary_search(val, low=0, high=(length - 1)) 
    return false if high < low 
    mid = (low + high)/2 
    midvalue = self[mid].downcase.strip 

    value = self[mid] <=> val 
    printf "%s \t %s \t %d \t %d\n", midvalue, val, mid, value 
    case 
    when value==0 then return true 
    when value > 0 then binary_search(val, low, mid-1) 
    when value < 0 then binary_search(val, mid+1, high) 
    end 
    end 
end 

path = ARGV.length > 0 ? ARGV[0] : '/words' 
entries = File.read(path).split("\n") 

if entries.binary_search("administrate") 
    printf "yes" 
else 
printf "no" 
end 

但是,我无法找到的单词“管理金融”,这是在Word文件。 这是输出我得到:

 
mogitocia administrate 117467  1 
dysoxidation  administrate 58733 1 
canacee  administrate 29366 -1 
counterdistinction administrate 44049 1 
citification  administrate 36707 1 
cetomorphic  administrate 33036 1 
castellanship administrate 31201 1 
carboxylase  administrate 30283 1 
capelet  administrate 29824 1 
cankery  administrate 29595 1 
candied  administrate 29480 1 
cancelation  administrate 29423 1 
canalling administrate 29394 1 
canalage  administrate 29380 1 
canadine  administrate 29373 1 
canadian  administrate 29369 -1 
canadianization  administrate 29371 -1 
canadianize  administrate 29372 -1 
+0

您还需要提供您的输入。 –

+2

另外,如果有散列可用,则不要在数组上使用二进制搜索。散列总是会赢。 –

+1

另外,您可能有兴趣知道ruby 2.0有一个内置的数组搜索方法:'ary.bsearch {| x | “管理”<=> x}' – pje

回答

1

变化

value = self[mid] <=> val 

value = midvalue <=> val 

否则你正在使用的未downcased self[mid],所以自然'C'进来ASCII'a'之前。