2010-06-03 5 views
26

Tôi đang tạo một bộ tạo hộp trong Ruby và tôi cần tính toán một số thứ.Tìm mức cao nhất, thấp nhất, tổng, trung bình và trung bình từ một mảng trong Ruby

Hãy nói rằng tôi có mảng này:

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

Làm thế nào tôi có thể tìm thấy giá trị thấp nhất (1), giá trị cao nhất (65), tổng số (157), trung bình (22,43) và trung bình (7) từ mảng trên?

Cảm ơn

+0

khuyên bạn nên thay đổi tổng số dòng = arr.inject (: +) thành tổng = arr.inject (0,: +) để tránh nhận giá trị nil – user1283153

Trả lời

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

Bạn cần thận trọng hơn một chút với trung bình, trong trường hợp 'arr.length' chia hết cho 2. Một phương thức luôn luôn hoạt động là' do sortedarr = arr.sort; medpt1 = arr.length/2; medpt2 = (arr.length + 1)/2; (sortarr [medpt1] + sortedarr [medpt2]). to_f/2; cuối cùng, nhưng rõ ràng đó là đắt hơn, và không phải là tốt đẹp và xinh đẹp, như những gì bạn có trong câu trả lời của bạn. –

+0

@Aidan: Cảm ơn. Sửa lỗi. – sepp2k

+1

Một lưu ý nhỏ: arr.inject (: +) sẽ chỉ hoạt động trong Ruby 1.8.7 hoặc cao hơn (hoặc nếu một thư viện khác đã thực hiện Symbol # to_proc, như ActiveSupport của Rails). Nếu không, arr.inject {| sum, n | sum + n} sẽ hoạt động. –

1

Tìm mức tối thiểu, tối đa, tổng và trung bình là tầm thường và có thể được thực hiện dễ dàng trong thời gian tuyến tính được thể hiện bằng câu trả lời sepp2k của trên.

Tìm trung bình trung bình ít tầm thường hơn và triển khai ngây thơ (sắp xếp và sau đó lấy phần tử ở giữa) chạy trong thời gian O (nlogn).

Tuy nhiên, các thuật toán tìm thấy trung vị trong thời gian tuyến tính (chẳng hạn như thuật toán trung bình-5). Những người khác làm việc ngay cả đối với bất kỳ loại thống kê đơn hàng nào (ví dụ, bạn muốn tìm phần tử nhỏ thứ 5). Vấn đề với những người đó là bạn sẽ phải tự mình thực hiện chúng, tôi biết không có triển khai Ruby nào.

O (nlogn) là khá nhanh, vì vậy nếu bạn không có kế hoạch làm việc trên các tập dữ liệu khổng lồ (và nếu bạn sẽ cần sắp xếp dữ liệu của mình), bạn sẽ ổn với điều đó.