2014-01-23 2 views
0

"Canacee"는 "administrate"보다 알파벳순으로 평가되는 것보다 평가됩니다. 그러나 문자열 배열을 검색하는 이진 검색 알고리즘을 개발 중입니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까? 내 코드 :ruby에서 사전 순으로 문자열 비교 비교

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 

는 그러나, 나는 단어 파일에 단어 "[관리]"를 찾을 수 없습니다입니다.

 
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

또한, 루비 2.0에는 배열에 대한 바이너리 검색 방법이 내장되어 있다는 것을 알고 싶을 것이다.'ary.bsearch {| x | "administrate"<=> x}' – pje

답변

1

변경

value = self[mid] <=> val 

value = midvalue <=> val 

그렇지 않으면 당신이 사용하는

에 해제 downcased, self[mid]을 자연스럽게 'C'ASCII에서 'a' 앞에 오는 : 이것은 내가 얻을 출력됩니다.