Найти медиану N 8-битных чисел

Дан массив из N 8-битных чисел (значение 0-255)?

Как найти медиану?

Я пробовал алгоритмы сортировки по основанию и медианы медиан.

Есть ли лучший способ, учитывая, что значения чисел находятся в диапазоне от 0 до 255?


person Idan    schedule 08.09.2015    source источник


Ответы (1)


Используйте нечто похожее на сортировку подсчетом.

  • Создайте массив «counts» размером 256, инициализированный всеми нулями. counts[x] будет количеством раз, когда x появляется во входном массиве.
  • Перебирайте свой входной массив, увеличивая значение в позиции в массиве counts, соответствующем каждому значению во входном массиве (так что counts[input[i]]++).
  • Перебирайте массив counts, суммируя все значения, пока не получите половину общего количества значений. Индекс будет числом, которое мы ищем (некоторая дополнительная логика, необходимая для работы с четным числом значений).

Это выполняется за O(n) времени с использованием O(1) пространства (что асимптотически оптимально).

Что-то вроде: (псевдокод)

// Count the number of occurrences of each value.
counts[256] = {0}
for i = 0 to input.length
   counts[input[i]]++

// Get the median.
count = input.length
sum = 0
if count divisible by 2
   first = NaN
   for i = 0 to counts.length
      sum += counts[i]
      if first == NaN && sum >= count / 2
         first = i
      if sum >= count / 2 + 1
         median = (first + i) / 2
         break
else
   for i = 0 to counts.length
      sum += counts[i]
      if sum >= (count + 1) / 2
         median = i
         break
return median

Существуют и другие способы достижения той же временной и пространственной сложности (хотя и немного более сложные, чем приведенные выше, и требующие изменения входного массива):

person Bernhard Barker    schedule 08.09.2015