我的数据库中有100个整数。 我按升序排序。 现在,对于第99个百分位,我在排序后取第99个数字。
在给定时间 t 之后,新数字进入数据库并丢弃旧数字。 当前代码只取100整数并重新排序。
由于原始100个整数的集合共有99个数字,并且在 t 之后有100个整数的集合。是否有更有效的方法来计算第99百分位数,第95百分位数,第90百分位数等?
PS:所有这些都是在MySQL数据库
下完成的答案 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 部分)。