2010-06-03 8 views
26

Estoy creando un generador de gráficas de caja en Ruby, y necesito calcular algunas cosas.Encontrar el más alto, el más bajo, el total, el promedio y la mediana de una matriz en Ruby

Digamos que tengo esta matriz:

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

¿Cómo puedo encontrar el valor más bajo (1), el valor más alto (65), total (157), promedio (22,43) y la mediana (7) a partir de la matriz anterior?

Gracias

+0

recomendaría cambiar la línea total = arr.inject (: +) a total = arr.inject (0,: +) para evitar obtener un valor nulo – user1283153

Respuesta

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

Debe tener un poco más cuidado con la mediana, en case 'arr.length' es divisible por 2. Un método que siempre debería funcionar es' do sortedarr = arr.sort; medpt1 = arr.length/2; medpt2 = (arr.length + 1)/2; (sortedarr [medpt1] + sortedarr [medpt2]). to_f/2; end', pero obviamente eso es más caro, y no tan bonito y bonito, como lo que tienes en tu respuesta. –

+0

@Aidan: Gracias. Arreglado. – sepp2k

+1

Una nota menor: arr.inject (: +) solo funcionará en Ruby 1.8.7 o superior (o si otra biblioteca ha implementado Symbol # to_proc, como lo hace ActiveSupport de Rails). De lo contrario, arr.inject {| sum, n | sum + n} funcionaría. –

1

Encontrar el mínimo, el máximo, suma y promedio son triviales y se puede hacer fácilmente en un tiempo lineal como se muestra por la respuesta de sepp2k anteriormente.

Encontrar la mediana es menos trivial y la implementación ingenua (clasificación, y luego tomar el elemento medio) se ejecuta en el tiempo O (nlogn).

Sin embargo, existen algoritmos que encuentran la mediana en tiempo lineal (como el algoritmo de la mediana de 5). Otros funcionan incluso para cualquier tipo de estadística de orden (por ejemplo, usted quiere encontrar el quinto elemento más pequeño). El problema con ellos es que tendrías que implementarlos tú mismo, no conozco ninguna implementación de Ruby.

O (nlogn) ya es bastante rápido, por lo que si no planeas trabajar en enormes conjuntos de datos (y si necesitas ordenar tus datos de todos modos), estarás bien con eso.

Cuestiones relacionadas