Подтвердить что ты не робот

Вычисление медианы в Ruby

Как вычислить медиану массива чисел с помощью Ruby?

Я начинающий и в процессе моего обучения я стараюсь придерживаться того, что уже было изучено. Таким образом, другие вопросы, которые я нашел, выходят за рамки моих возможностей.

Вот мои заметки и моя попытка:

  • сортировать массив в порядке возрастания.
  • выяснить, является ли оно нечетным или даже длинным.
  • если нечетно, разделите длину отсортированного массива +1 пополам. Что является индексом медианы. Верните это значение.
  • если даже, найдите средние два числа отсортированного массива и разделите их на 1/2. Верните это значение.
  • Поиск двух средних чисел:
  • разделите отсортированную длину массива пополам. Это индекс pt. первый средний номер.
  • разделите отсортированную длину массива + 2 пополам. Это индекс pt. из второй средний число.
  • берут среднее значение этих двух средних чисел.

    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
    
4b9b3361

Ответ 1

Вот решение, которое работает как на четном, так и на нечетном массиве и не будет изменять массив:

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

Ответ 2

Если при вычислении медианы вы имеете в виду 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

Подобно 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

Ответ 4

  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?
        return array[(array.length - 1) / 2] #find value at this index
      else array.length.even?                #is the length of the array even?
        return ( 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

Ответ 5

def median(array)
  half = array.sort!.length / 2
  array.length.odd? ? array[half] : (array[half] + array[half - 1]) / 2 
end

* Если длина четная, вы должны добавить среднюю точку плюс среднюю точку - 1 для учета индекса, начинающегося с 0

Ответ 6

Я думаю, это хорошо:

#!/usr/bin/env ruby

#in-the-middle value when odd or
#first of second half when even.
def median(ary)
  middle = ary.size/2
  sorted = ary.sort_by{ |a| a }
  sorted[middle]
end

или

#in-the-middle value when odd or
#average of 2 middle when even.
def median(ary)
  middle = ary.size/2
  sorted = ary.sort_by{ |a| a }
  ary.size.odd? ? sorted[middle] : (sorted[middle]+sorted[middle-1])/2.0
end

Я использовал sort_by, а не сортировку, потому что это быстрее: Сортировка массива в порядке убывания в Ruby.