2014-01-31 5 views
0

Я написал код, который возвращает медиану несортированного нечетного нумерованного массива, но не возвращает медиану четного пронумерованного массива.Найти медиану массива

Я знаю, что для того, чтобы найти медиану четного пронумерованного массива, вы должны взять средние два числа массива, усреднить их, и это медиана. Я не могу перевести это в полезный код. Помимо очевидной многословности этого кода, проблема, похоже, связана с линиями 7-8, и я не понимаю, почему.

Я предпочитаю подсказки для ответов, но если вы скорее разместите какой-либо фиксированный код, я тоже могу принять это.

def media(array) 
    sorted = array.sort 
    list = sorted.length 
    if list %2 != 0 
    (list + 1)/2.0 
    else 
    even = ((list.to_f + 2)/2) + ((list.to_f/2) 
    return (even/2) 
    end 
end 
+2

младший, нужно делать операции на элементах 'sorted', а не на его длину. Обратите внимание, что сортировка теперь для вас ничего не делает; 'list = array.length' будет давать одинаковые результаты. Вам нужно работать с 'sorted'. –

+2

Для нечетной длины вы возвращаете средний показатель *. Для четной длины нет индекса, который вы можете вернуть, верно? Поэтому перепишите это так, чтобы оно возвращало рассчитанные значения. Например. для нечетного массива возвращаем 'sorted [(list + 1)/2]' и для четного массива возвращаем '(отсортированный [i] + отсортированный [i-1])/2', где вам нужно будет вычислить' i '. – Matt

+0

Вы пытаетесь найти медианное значение * в массиве или * индекс * медианы в отсортированном массиве? Потому что ваш код, похоже, пытается сделать последнее. – wdebeaum

ответ

4

Я собираюсь просто прыгать с решением здесь ...

def median(ary) 
    mid = ary.length/2 
    sorted = ary.sort 
    ary.length.odd? ? sorted[mid] : 0.5 * (sorted[mid] + sorted[mid - 1]) 
end 

Edit - Я включен .odd? согласно предложению BroiSatse в.

+1

Не может быть более читаемым с помощью 'ary.length.odd?' – BroiSatse

+0

Использование '& 1' действительно странно. Лучше было бы '% 2 == 0' или' .odd? ', Как рекомендовано @BroiSatse. – tadman

+1

@ tadman Думаю, я показываю свой возраст. Назад в тот день, когда мы его вложили в нас, чтобы избежать операций на основе разделения, когда это возможно, включая '%'. – pjs

1
a = [1,2,4,5,3,6] 
    sorted = a.sort 
    list = sorted.length 
    if list %2 != 0 
    puts sorted[list/2] 
    else 
    puts (sorted[list/2]+sorted[(list/2)-1])/2.0 
    end 
0
def get_median(values) 
    quotient, remainder = values.sort!.length.divmod(2) 
    medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq 
    medians.length > 1 ? medians.map(&:to_f).reduce(:+)/2 : medians[0] 
end 

Этот должен работать, но дайте мне знать, если это не так.

редактировать забыл добавить .to_f к значениям медиан. Вот мое тестирование в Pry.

[1] pry(main)> def get_median(values) 
[1] pry(main)* quotient, remainder = values.sort!.length.divmod(2) 
[1] pry(main)* medians = [values[quotient], values[quotient-(remainder+1) % 2]].uniq 
[1] pry(main)* medians.length > 1 ? medians.map { |v| v.to_f }.reduce(:+)/2 : medians[0] 
[1] pry(main)* end 
=> nil 
[2] pry(main)> values = [1,2,3] 
=> [1, 2, 3] 
[3] pry(main)> get_median values 
=> 2 
[4] pry(main)> values << 4 
=> [1, 2, 3, 4] 
[5] pry(main)> get_median values 
=> 2.5 
[6] pry(main)> get_median values << -1 
=> 2 
[7] pry(main)> values 
=> [-1, 1, 2, 3, 4] 
[8] pry(main)> values << 11 
=> [-1, 1, 2, 3, 4, 11] 
[9] pry(main)> get_median values << -1 
=> 2 
[10] pry(main)> values 
=> [-1, -1, 1, 2, 3, 4, 11] 
[11] pry(main)> values.delete_if { |v| v == -1} 
=> [1, 2, 3, 4, 11] 
[12] pry(main)> values << -1 
=> [1, 2, 3, 4, 11, -1] 
[13] pry(main)> get_median values 
=> 2.5 
[14] pry(main)> 
+0

Попробуйте несколько простых тестовых примеров, в которых вы знаете, каков должен быть ответ. '[11,10,12]' должен дать 11; '[11,10]' должен давать 10.5. – pjs

+0

Исправил это и отправил мое тестирование в подземелье. Узнал мой урок о публикации кода без тестирования. – josiah

0

Вот ответ:

def get_median(sub_a) 
    result = -1 
    size = sub_a.size 
    if size == 0 
     result = 0 
    elsif size == 1 
     result = sub_a[0] 
    elsif size == 2 
     result = get_average(sub_a[0], sub_a[1]) 
    else 
     sorted_a = sub_a.sort 
     index = size/2 
     if size % 2 == 0 
      result = get_average(sorted_a[index - 1], sorted_a[index]); 
     else 
      result = sorted_a[index]; 
     end 
    end 

    '%0.01f' % result 
end 
Смежные вопросы