2010-06-03 16 views
26

Sto creando un generatore di boxplot in Ruby e ho bisogno di calcolare alcune cose.Trovare il massimo, il minimo, il totale, la media e la mediana da un array in Ruby

Diciamo che ho questo array:

arr = [1, 5, 7, 2, 53, 65, 24] 

Come posso trovare il valore più basso (1), il valore più alto (65), totale (157), media (22,43) e la mediana (7) da l'array sopra?

Grazie

+0

consiglia di modificare la riga total = arr.inject (: +) in totale = arr.inject (0,: +) per evitare di ottenere un valore nullo – user1283153

risposta

61
lowest = arr.min 
highest = arr.max 
total = arr.inject(:+) 
len = arr.length 
average = total.to_f/len # to_f so we don't get an integer result 
sorted = arr.sort 
median = len % 2 == 1 ? sorted[len/2] : (sorted[len/2 - 1] + sorted[len/2]).to_f/2 
+4

È necessario essere un po 'più accurati con la mediana, in caso 'arr.length' è divisibile per 2. Un metodo che dovrebbe funzionare sempre è' do ​​sortedarr = arr.sort; medpt1 = arr.length/2; medpt2 = (arr.length + 1)/2; (ordinatoarr [medpt1] + sortedarr [medpt2]). to_f/2; fine', ma ovviamente è più costoso, e non così bello e carino, come quello che hai nella tua risposta. –

+0

@ Anna: Grazie. Aggiustato. – sepp2k

+1

Una nota minore: arr.inject (: +) funzionerà solo in Ruby 1.8.7 o versioni successive (o se un'altra libreria ha implementato Symbol # to_proc, come fa ActiveSupport di Rails). Altrimenti arr.inject {| sum, n | sum + n} funzionerebbe. –

1

Trovare il minimo, massimo, somma e la media sono banali e può essere fatto facilmente in tempo lineare come mostrato dalla risposta di sepp2k sopra.

Trovare la mediana è meno semplice e l'implementazione ingenua (l'ordinamento e quindi l'elemento centrale) viene eseguita in tempo O (nlogn).

Esistono, tuttavia, algoritmi che trovano la mediana in tempo lineare (come l'algoritmo della mediana di 5). Altri funzionano anche per qualsiasi tipo di statistica degli ordini (ad esempio, si desidera trovare l'elemento 5 ° più piccolo). Il problema con questi è che dovresti implementarli da soli, non conosco nessuna implementazione di Ruby.

O (nlogn) è già abbastanza veloce, quindi se non hai intenzione di lavorare su enormi set di dati (e se hai bisogno di ordinare i tuoi dati comunque), starai bene con quello.

Problemi correlati