【问题标题】:Find median of N 8-bit numbers求 N 个 8 位数字的中位数
【发布时间】:2015-12-04 01:22:40
【问题描述】:

给定一个由 N 个 8 位数字组成的数组(值 0-255)?

如何求中位数?

我已经尝试过基数排序和中位数算法。

鉴于数字的值介于 0 和 255 之间,是否有更好的方法?

【问题讨论】:

    标签: algorithm sorting median radix-sort median-of-medians


    【解决方案1】:

    使用类似于counting sort 的内容。

    • 创建一个大小为 256 的“计数”数组,初始化为全 0。 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
    

    还有其他方法可以达到相同的时间和空间复杂度(虽然比上面的复杂一点,并且需要你修改输入数组):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2013-12-01
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多