2010-06-03 20 views
26

Ruby'de bir kutu grafiği oluşturuyorum ve bazı şeyleri hesaplamam gerekiyor.Ruby'de bir diziden en yüksek, en düşük, toplam, ortalama ve medyan bulma

en bu dizi var diyelim: ortalama toplam

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

nasıl en düşük değere (1) bulabilirsiniz, en yüksek değer (65), (157), (22.43) ve medyan den (7) Yukarıdaki dizi?

Teşekkür

+0

satır toplamını değiştirmenizi tavsiye eder = arr.inject (: +) toplam = arr.inject (0,: +) sıfır değer elde etmemek için – user1283153

cevap

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

Ortala daha dikkatli olmanız gerekir. 'arr.length' 2 tarafından bölünebilir. Her zaman çalışması gereken bir yöntem 'sortedarr = arr.sort; medpt1 = arr.length/2; medpt2 = (arr.length + 1)/2; (sortedarr [medpt1] + sortedarr [medpt2]) to_f/2; Sonunda, ama açıkçası bu sizin cevabınızda sahip olduğunuz kadar güzel ve güzel değil, daha pahalı. –

+0

@Aidan: Teşekkürler. Onu düzeltti. – sepp2k

+1

Bir küçük not: arr.inject (: +) yalnızca Ruby 1.8.7 veya daha büyük bir sürümde çalışacaktır (veya Rails 'ActiveSupport'un yaptığı gibi başka bir kütüphane Symbol # to_proc uyguladıysa). Aksi takdirde arr.inject {| sum, n | toplamı + n} çalışırdı. –

1

minimum maksimum, toplamı bulma ve ortalama önemsiz ve yukarıdaki sepp2k yanıtı gösterdiği gibi doğrusal zamanda kolayca yapılabilir.

medyan'u bulmak daha az önemsizdir ve naif uygulama (sıralama ve sonra orta öğeyi alarak) O (nlogn) saatinde çalışır. Ancak, lineer zamanda (ortalama-5 algoritması gibi) medyanı bulmakta olan algoritmalar bulunmaktadır. Diğerleri her türlü sipariş istatistiği için bile çalışırlar (5'inci en küçük elemanı bulmak istersiniz). Bunlarla ilgili problem, bunları kendiniz uygulamak zorunda olmanızdır, Ruby uygulamasının olmadığını biliyorum.

O (nlogn) zaten çok hızlı, bu yüzden büyük veri kümeleri üzerinde çalışmayı planlamıyorsanız (ve yine de verilerinizi sıralamanız gerekirse), bununla iyi geçineceksiniz.

İlgili konular