计算数据集第99百分位数的最有效方法

时间:2016-09-08 21:38:29

标签: algorithm

我的数据库中有100个整数。 我按升序排序。 现在,对于第99个百分位,我在排序后取第99个数字。

在给定时间 t 之后,新数字进入数据库并丢弃旧数字。 当前代码只取100整数并重新排序。

由于原始100个整数的集合共有99个数字,并且在 t 之后有100个整数的集合。是否有更有效的方法来计算第99百分位数,第95百分位数,第90百分位数等?

PS:所有这些都是在MySQL数据库

下完成的

3 个答案:

答案 0 :(得分:0)

如果您的数据是随机分布的,您可以尝试通过假设线性分布来猜测位置。

guessPosition = newnumber *(max-min)/ 100

然后从那一点开始进行驰骋搜索。

发现时将其插入正确的位置。

答案 1 :(得分:0)

让我们调用N数组的大小A(此处为N = 100),然后您正在寻找K个最小元素(经过一些修改请求)。

最简单的解决方案可能是一种经过修改的插入排序:保留N-K+1个最大元素的(排序)数组(让我们称之为B)。

  • 弃置元素e:浏览B(例如,B[i] < e)(*)。如果B[i] = e,请将所有元素< i移至右侧。
  • 插入元素e:获取较低的索引i,使其B[i] > e。将所有元素>= i向右移动并设置B[i] := e
  • 获取K - 更小的元素:return B[0]

时间复杂度:每个请求O(N-K)

(*)实际上你可以使用二进制搜索加快搜索步骤,但它不会改变整体时间复杂度。

如果N-K非常大,那么使用二叉树(每个请求的时间复杂度为O(log(N-K)))会很有趣。但考虑到您的数据集(以及您的编程语言)的实际大小,它不会成为&#34;创造利润&#34;。

答案 2 :(得分:0)

因此,插入到普通表中,并添加触发器以插入到额外的排序表中。每次插入额外的表时,添加新元素,然后使用索引应该很快找到最小(或最大)元素。放下那个元素。如果项目数 (K) 很小,现在要么重新计算新的百分位数。或者也许将元素的总和存储在某处,然后减去丢弃的值并添加添加的值。然后你们都有总和(不迭代整个列表),并且元素总数也应该很快从数据库中获得。应该是 log(N-K) ish 时间。我认为这是一个 Google 面试问题(减去 DB 部分)。