Znajdowanie najwyższej, najniższej, całkowitej, średniej i Mediany z tablicy w Ruby

Tworzę generator boxplot w Ruby i muszę obliczyć kilka rzeczy.

Powiedzmy, że mam tę tablicę:

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

Jak mogę znaleźć najniższą wartość (1), najwyższą wartość (65), całkowitą (157), średnią (22,43) i medianę (7) z powyższej tablicy?

Thanks

Author: Drew Johnson, 2010-06-03

2 answers

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
 63
Author: sepp2k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-30 21:51:50

Znalezienie minimum, maksimum, sumy i średniej jest trywialne i można je łatwo wykonać w czasie liniowym, jak pokazano powyżej w odpowiedzi sepp2k.

Znalezienie mediany jest mniej trywialne, a naiwna implementacja (sortowanie, a następnie pobranie środkowego elementu) przebiega w czasie O(nlogn).

Istnieją jednak algorytmy, które znajdują medianę w czasie liniowym(takie jak algorytm mediana-of-5). Inni pracują nawet dla każdego rodzaju statystyki zamówienia (powiedzmy, że chcesz znaleźć 5-te najmniejsze element). Problem z nimi polega na tym, że sam musiałbyś je zaimplementować, nie znam żadnej implementacji Ruby.

O (nlogn) jest już dość szybki, więc jeśli nie planujesz pracować nad ogromnymi zestawami danych( i jeśli i tak będziesz musiał sortować swoje dane), będziesz z tym w porządku.

 1
Author: Fryie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-26 18:42:14