【问题标题】:Avoiding Big Database call on a running median避免在运行中位数上调用大数据库
【发布时间】:2017-10-09 14:37:35
【问题描述】:

不是真正的编码问题,更多的是我该怎么做这个问题,所以没有代码 sn-p。

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

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

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

在引入新数字后,是否有任何技巧可以让我不必每天调用所有数据来计算今天的中位数?

感谢您的任何想法!

【问题讨论】:

标签: algorithm median


【解决方案1】:

您不需要所有单独的值来计算中位数。如果您对中位数应该位于的区间(例如 5 到 20 之间)有一个初始猜测,您可以拆分这些值:

  • LOW:计算区间 (x
  • CENTER:查询区间 (5
  • HIGH:计算区间 (x >= 20) 以上的值,计数为 2。

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

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

通过适当的数据库列索引,三个查询应该相当快,并且产生的数据量不应在数据库和客户端软件之间造成过多的流量。

一种不需要初始猜测的变体可能是按箱计算值,例如5 (trunc(x/5)),给出:

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

如果在一个 bin 内达到中位数,您可以查询该 bin 中的数字并计算它们的中位数。但在我们的示例中,它位于 5...9 和 10...14 箱之间,因此必须查询两个箱 (5

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多