Rubyを使用して数値の配列の中央値を計算するにはどうすればよいですか?
私は初心者であり、私の学習の進展の中で、すでに教えられたことに固執しようとしています。したがって、私が見つけた他の質問は私の範囲を超えています。
ここに私のメモと私の試みがあります:
これらの2つの中間値の平均を取る。
def median(array)
ascend = array.sort
if ascend % 2 != 0
(ascend.length + 1) / 2.0
else
((ascend.length/2.0) + ((ascend.length + 2)/2.0) / 2.0)
end
end
偶数と奇数の長さの配列の両方で機能し、配列を変更しないソリューションは次のとおりです。
def median(array)
sorted = array.sort
len = sorted.length
(sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
中央値を計算することで this を意味する場合
それから
a = [12,3,4,5,123,4,5,6,66]
a.sort!
elements = a.count
center = elements/2
elements.even? ? (a[center] + a[center+1])/2 : a[center]
Nbarrailleのものに似ていますが、これがなぜ機能するのかを追跡する方が少し簡単です:
class Array
def median
sorted = self.sort
half_len = (sorted.length / 2.0).ceil
(sorted[half_len-1] + sorted[-half_len]) / 2.0
end
end
half_len =配列の中間(アイテムの数が奇数の配列の場合)までの要素数
さらに簡単:
class Array
def median
sorted = self.sort
mid = (sorted.length - 1) / 2.0
(sorted[mid.floor] + sorted[mid.ceil]) / 2.0
end
end
def median(array) #Define your method accepting an array as an argument.
array = array.sort #sort the array from least to greatest
if array.length.odd? #is the length of the array odd?
array[(array.length - 1) / 2] #find value at this index
else array.length.even? #is the length of the array even?
(array[array.length/2] + array[array.length/2 - 1])/2.to_f
#average the values found at these two indexes and convert to float
end
end
def median(array)
half = array.sort!.length / 2
array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2
end
*長さが偶数の場合、0から始まるインデックスを説明するために、中点と中点-1を追加する必要があります
Edgeケースの処理に関するより適切なソリューション:
class Array
def median
sorted = self.sort
size = sorted.size
center = size / 2
if size == 0
nil
elsif size.even?
(sorted[center - 1] + sorted[center]) / 2.0
else
sorted[center]
end
end
end
証明する仕様があります:
describe Array do
describe '#median' do
subject { arr.median }
context 'on empty array' do
let(:arr) { [] }
it { is_expected.to eq nil }
end
context 'on 1-element array' do
let(:arr) { [5] }
it { is_expected.to eq 5 }
end
context 'on 2-elements array' do
let(:arr) { [1, 2] }
it { is_expected.to eq 1.5 }
end
context 'on odd-size array' do
let(:arr) { [100, 5, 2, 12, 1] }
it { is_expected.to eq 5 }
end
context 'on even-size array' do
let(:arr) { [7, 100, 5, 2, 12, 1] }
it { is_expected.to eq 6 }
end
end
end