本博客将介绍Quantile估算中的一种算法:Random,该算法同样源于Manku等人的Approximate medians and other quantiles in one pass and with limited memory一文的思想。
算法介绍
SampleBuffer的生成
该算法需要维持一个SampleBuffer的数据结构,该数据结构共有b个buffer:B1、B2、…、Bb,每个buffer的大小为k,每个buffer还会对应其所处的Level,其计算公式为:
L=L(n,h)=max(0,⌈logk×2h−1n⌉)(1)
其中:n是已经处理过的元素个数,L(0,h)=0。
对于某个buffer:BiL的生成:从输入的k∗2L个元素中选择k个元素。

SampleBuffer的合并
对于处于相同层L的两个buffer合并生成buffer(处于层L+1):将两个buffer的元素合并排序,从排好序的2k个元素中选择k个元素以生成第L+1层的buffer。

算法流程
- 根据公式1计算当前需要生成的buffer所处的层数L,从数据流中k×2L个元素中选取k个元素,重复该步骤,直到buffer均已被填满;
- 选择层数较低的两个buffer来生成新buffer
示例




对于给定分位数q查询对应元素,可以采用二分搜索来减少搜素时间。