Дан массив из N 8-битных чисел (значение 0-255)?
Как найти медиану?
Я пробовал алгоритмы сортировки по основанию и медианы медиан.
Есть ли лучший способ, учитывая, что значения чисел находятся в диапазоне от 0 до 255?
Дан массив из N 8-битных чисел (значение 0-255)?
Как найти медиану?
Я пробовал алгоритмы сортировки по основанию и медианы медиан.
Есть ли лучший способ, учитывая, что значения чисел находятся в диапазоне от 0 до 255?
Используйте нечто похожее на сортировку подсчетом.
counts[x]
будет количеством раз, когда x
появляется во входном массиве.counts[input[i]]++
).Это выполняется за 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
Существуют и другие способы достижения той же временной и пространственной сложности (хотя и немного более сложные, чем приведенные выше, и требующие изменения входного массива):
Вариант быстрой сортировки, который оптимизирован для повторяющихся значений путем разделения массива на 3 вместо 2 на каждом шаге (меньшие, равные и большие значения).
Вариант сортировки по основанию, который используется на месте.
Алгоритм медианы медиан также фактически разделяет эту сложность.