Y at-il une meilleure façon de trouver l'emplacement d'un élément minimum dans un tableau?

StackOverflow https://stackoverflow.com/questions/855693

  •  21-08-2019
  •  | 
  •  

Question

En ce moment j'ai

def min(array,starting,ending)
  minimum = starting
  for i in starting+1 ..ending
    if array[i]<array[minimum]
      minimum = i
    end    
  end

return minimum
end

Y at-il une meilleure « mise en œuvre » en Ruby? Celui-ci semble encore c-ish. Merci.

Était-ce utile?

La solution

Si vous voulez trouver l'index de l'élément minimal, vous pouvez utiliser pour Enumerable#enum_for obtenir un tableau de paires éléments-index, et de trouver le minimum de ceux qui ont Enumerable#min (qui sera également le minimum du tableau d'origine).

% irb
irb> require 'enumerator'
#=> true
irb> array = %w{ the quick brown fox jumped over the lazy dog }
#=> ["the", "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog"]
irb> array.enum_for(:each_with_index).min
#=> ["brown", 2]

Si vous voulez lié à des indices de tableau spécifiques:

irb> start = 3
#=> 3
irb> stop = 7
#=> 7
irb> array[start..stop].enum_for(:each_with_index).min
#=> ["fox", 0]
irb> array[start..stop].enum_for(:each_with_index).min.last + start
#=> 3

Autres conseils

En fait, c'est le meilleur que vous pouvez faire, si vous pouvez écrire un peu plus succinctement:

def minval(arr)
    arr.inject {|acc,x| (acc && acc < x ? acc : x)}
end

Il y a une façon plus simple et ça marche pour moi en Ruby 1.9.2:

a = [6, 9, 5, 3, 0, 6]
a.find_index a.min

Ceci est l'algorithme standard pour trouver l'élément minimum dans un tableau, il peut être mieux en ayant déjà le tableau est trié avant que cette fonction est appelée.

Sinon, je ne peux pas trouver un moyen plus efficace de le faire. Plus précisément, le temps linéaire en notation grand O est le meilleur que nous pouvons faire.

Si ce n'est pas simplement une question académique, pourquoi ne pas simplement utiliser la méthode native de Ruby sort? Il est mis en œuvre en utilisant un algorithme de tri rapide, et est considéré comme assez rapide.

a = [3, 4, 5, 1, 7, 5]
a.sort![0] # => 1
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top