C'è un modo migliore per trovare la posizione di un elemento minimo in un array?

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

  •  21-08-2019
  •  | 
  •  

Domanda

In questo momento ho

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

C'è una migliore "implementazione" in Ruby? Questo sembra ancora c-ish. Grazie.

È stato utile?

Soluzione

Se si vuole trovare l'indice dell'elemento minimo, è possibile utilizzare per Enumerable#enum_for ottenere un array di coppie articoli-index, e trovare il minimo di quelli con Enumerable#min (che sarà anche il minimo della matrice originale).

% 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]

Se desideri legati a indici degli array specifici:

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

Altri suggerimenti

In fondo questo è il meglio che si può fare, anche se è possibile scrivere un po 'più succintamente:

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

C'è un modo più semplice e funziona per me in Ruby 1.9.2:

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

Questa è l'algoritmo standard per trovare l'elemento minimo in un array, può essere meglio avendo la matrice già essere ordinata prima questa funzione viene richiamata.

In caso contrario, non riesco a trovare un modo più efficiente di fare questo. In particolare, il tempo lineare in o-grande è il meglio che possiamo fare.

Se questo non è semplicemente una questione accademica, perché non basta utilizzare il metodo di Ruby nativo sort? E 'implementato utilizzando un algoritmo Quicksort, ed è considerato abbastanza veloce.

a = [3, 4, 5, 1, 7, 5]
a.sort![0] # => 1
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top