2010-06-03 5 views
26

Je crée un générateur boxplot en Ruby, et j'ai besoin de calculer certaines choses.Trouver le plus haut, le plus bas, le total, la moyenne et la médiane d'un tableau en Ruby

Disons que j'ai ce tableau:

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

Comment puis-je trouver la valeur la plus faible (1), la valeur la plus élevée (65), au total (157), moyenne (22,43) et la médiane (7) le tableau ci-dessus?

Merci

+0

recommande de changer la ligne totale = arr.inject (: +) au total = arr.inject (0,: +) pour éviter d'obtenir une valeur nulle – user1283153

Répondre

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

Vous devez être un peu plus prudent avec la médiane, en Le cas 'arr.length' est divisible par 2. Une méthode qui devrait toujours fonctionner est' do sortedarr = arr.sort; medpt1 = arr.length/2; medpt2 = (arr.length + 1)/2; (triedarr [medpt1] + triedarr [medpt2]). to_f/2; fin, mais évidemment c'est plus cher, et pas aussi beau et joli, que ce que vous avez dans votre réponse. –

+0

@Aidan: Merci. Je l'ai réparé. – sepp2k

+1

Une note mineure: arr.inject (: +) ne fonctionnera que dans Ruby 1.8.7 ou supérieur (ou si une autre bibliothèque a implémenté Symbol # to_proc, comme le fait ActiveSupport de Rails). Sinon, arr.inject {| sum, n | sum + n} fonctionnerait. –

1

Trouver le minimum, le maximum, la somme et la moyenne sont négligeables et peuvent se faire facilement dans le temps linéaire comme le montre la réponse de sepp2k ci-dessus.

Trouver médiane est moins triviale et l'implémentation naïve (tri, puis en prenant l'élément du milieu) s'exécute en temps O (nlogn). Il existe cependant des algorithmes qui trouvent la médiane en temps linéaire (tel que l'algorithme médian de 5). D'autres fonctionnent même pour n'importe quel type de statistique d'ordre (par exemple, vous voulez trouver le 5ème plus petit élément). Le problème avec ceux-ci est que vous auriez à les implémenter vous-même, je ne connais aucune implémentation de Ruby. O (nlogn) est déjà assez rapide, donc si vous n'avez pas l'intention de travailler sur d'énormes jeux de données (et si vous avez besoin de trier vos données de toute façon), cela ne vous dérange pas.

Questions connexes