web-dev-qa-db-ja.com

Rubyの中央値の計算

Rubyを使用して数値の配列の中央値を計算するにはどうすればよいですか?

私は初心者であり、私の学習の進展の中で、すでに教えられたことに固執しようとしています。したがって、私が見つけた他の質問は私の範囲を超えています。

ここに私のメモと私の試みがあります:

  1. 配列を昇順で並べ替えます。
  2. 長さが奇数か偶数かを判断します。
  3. 奇数の場合、ソートされた配列の長さ+1を半分に分割します。これが中央値のインデックスです。この値を返します。
  4. 偶数の場合、ソートされた配列の中央の2つの数字を見つけて、それらを1/2に分割します。この値を返します。
  5. 中央の2つの数字を見つける:
  6. ソートされた配列の長さを半分に分割します。これはインデックスptです。最初の中間番号。
  7. ソートされた配列の長さ+ 2を半分に分割します。これはインデックスptです。 2番目の中間番号の。
  8. これらの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
    
44
tomgalpin

偶数と奇数の長さの配列の両方で機能し、配列を変更しないソリューションは次のとおりです。

def median(array)
  sorted = array.sort
  len = sorted.length
  (sorted[(len - 1) / 2] + sorted[len / 2]) / 2.0
end
83
nbarraille

中央値を計算することで 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]  
3
AnkitG

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
2
Kal
  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
1
def median(array)
  half = array.sort!.length / 2
  array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2 
end

*長さが偶数の場合、0から始まるインデックスを説明するために、中点と中点-1を追加する必要があります

0
user3007294

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
0
Alexander