2013-09-24 3 views
0

Je suis confronté à des problèmes dans le développement d'un algorithme de recherche binaire efficace Ruby en référence à this site
binaire Recherche retour mauvaise valeur

Réponse correcte: Retour une valeur -1432
reçu Réponse: Nil

code

est la suivante:

def bsearch(a, k) 

lower = 0 
upper = a.length-1 

while a[upper].to_f> k.to_f and a[lower].to_f< k.to_f 
    low_diff = k.to_f -a[lower].to_f 
    range_diff = a[upper].to_f-a[lower].to_f 
    count_diff = upper-lower 
    range = ((low_diff/range_diff) * (count_diff)) + lower 

    if k.to_f > a[range].to_f 
     lower = range+1 
    elsif k.to_f < a[range].to_f 
     upper =range-1 
    else  
     lower = range 
    end 
end 
if k =a[lower] 
    return lower 
else 
    return nil 
end 
end 

S'il vous plaît aidez-moi avec la logique.

+2

Vous savez (http://www.ruby-doc.org/core-2.0.0/Array.html#method-i-bsearch) [ 'Tableau # bsearch'], n'est-ce pas? – Stefan

Répondre

0

Comme @vacawama dit utiliser == au lieu de = en dernière condition if:

if k == a[lower] 

Et utiliser && au lieu de and en while état:

while a[upper].to_f > k.to_f && a[lower].to_f < k.to_f 

Ma sortie sur ce code:

more ./bsearch.rb 
#!/usr/bin/ruby 
def bsearch(a, k) 
    lower = 0 
    upper = a.length-1 
    while a[upper].to_f > k.to_f && a[lower].to_f < k.to_f 
     low_diff = k.to_f - a[lower].to_f 
     range_diff = a[upper].to_f - a[lower].to_f 
     count_diff = upper-lower 
     range = ((low_diff/range_diff) * (count_diff)) + lower 
     if k.to_f > a[range].to_f 
      lower = range + 1 
     elsif k.to_f < a[range].to_f 
      upper = range - 1 
     else  
      lower = range 
     end 
    end 
    if k == a[lower] 
     return lower 
    else 
     return nil 
    end 
end 

puts bsearch([1, 2, 3, 4, 5], 3) 

Est-ce un:

./bsearch.rb 
2.0