避免在正常运行的中位数

时间:2017-10-09 14:37:35

标签: algorithm median

不是真正的编码问题,更多的是如何解决这个问题,所以没有代码片段。

在我的数据库中,想象一长串未分类的数字。

nums = [9,12,15,18,22,100,1,4,3,2]
这给我的中值为10.5

但现在想象我的名单要长得多,[9,12,15,18,22,100,1,4,3,2 ......] 每天,我都会在此列表x中引入一个新号码。该列表存储在一个数据库中,我想避免访问数据库以获取所有这些数据,然后计算中位数。

在推出新号码后,我是否有必要每天调用所有数据以计算今天的中位数?

感谢您的任何想法!

1 个答案:

答案 0 :(得分:0)

您不需要所有单个值来计算中位数。如果您对中位数应该位于的间隔(例如介于5和20之间)有初步猜测,则可以拆分值:

  • LOW:计算间隔(x <= 5)以下的值,计数为4.
  • CENTER:查询区间内的值(5
  • HIGH:计算区间上方的值(x> = 20),计数为2.

由于LOW计数是HIGH计数的两倍,从CENTER中删除两个最高值,并计算剩余值的中位数。

如果计数差异未在CENTER中留下任何数字,则必须更改间隔并重试。

通过对数据库列进行适当的索引,这三个查询应该非常快,并且生成的数据量不应该在数据库和客户端软件之间创建过多的流量。

不需要初始猜测的变体可以是通过例如二进制数的二进制数来计算值。 5(trunc(x / 5)),给出:

  • 0 ... 4:count = 4
  • 5 ... 9:count = 1
  • 10 ... 14:count = 1
  • 15 ... 19:count = 2
  • 20 ... 24:count = 1
  • 100 ... 104:count = 1

如果在bin中达到中位数,则查询该bin中的数字并计算其中位数。但是在我们的例子中,它只是在5 ... 9和10 ... 14 bin之间,因此必须查询两个bin(5 <= x <= 14)并且从(两个)结果值中获取中值9和12,给出10.5。