【发布时间】:2015-12-04 01:22:40
【问题描述】:
给定一个由 N 个 8 位数字组成的数组(值 0-255)?
如何求中位数?
我已经尝试过基数排序和中位数算法。
鉴于数字的值介于 0 和 255 之间,是否有更好的方法?
【问题讨论】:
标签: algorithm sorting median radix-sort median-of-medians
给定一个由 N 个 8 位数字组成的数组(值 0-255)?
如何求中位数?
我已经尝试过基数排序和中位数算法。
鉴于数字的值介于 0 和 255 之间,是否有更好的方法?
【问题讨论】:
标签: algorithm sorting median radix-sort median-of-medians
使用类似于counting sort 的内容。
counts[x] 将是 x 在输入数组中出现的次数。counts[input[i]]++)。这使用O(1) 空间在O(n) 时间运行(这是渐近最优的)。
类似:(伪代码)
// 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
还有其他方法可以达到相同的时间和空间复杂度(虽然比上面的复杂一点,并且需要你修改输入数组):
A variant of quick sort 针对重复值进行了优化,通过在每一步将数组拆分为 3 个而不是 2 个(更小、相等和更大的值)。
The median of medians algorithm 实际上也有这种复杂性。
【讨论】: