本博客将介绍Quantile估算中的一种算法:Random,该算法同样源于Manku等人的Approximate medians and other quantiles in one pass and with limited memory一文的思想。

算法介绍

SampleBuffer的生成

该算法需要维持一个SampleBufferSampleBuffer的数据结构,该数据结构共有bbbufferbufferB1B_{1}B2B_{2}、…、BbB_{b},每个bufferbuffer的大小为kk,每个bufferbuffer还会对应其所处的LevelLevel,其计算公式为:
L=L(n,h)=max(0,lognk×2h1)(1)L=L(n,h)=max(0,\lceil log\frac{n}{k \times 2^{h-1}} \rceil )\tag{1}
其中:nn是已经处理过的元素个数,L(0,h)=0L(0,h)=0
对于某个bufferbufferBiLB_i^L的生成:从输入的k2Lk*2^L个元素中选择kk个元素。
Random

SampleBuffer的合并

对于处于相同层LL的两个bufferbuffer合并生成bufferbuffer(处于层L+1L+1):将两个bufferbuffer的元素合并排序,从排好序的2k2k个元素中选择kk个元素以生成第L+1L+1层的bufferbuffer
Random

算法流程

  1. 根据公式1计算当前需要生成的bufferbuffer所处的层数LL,从数据流中k×2Lk\times2^L个元素中选取kk个元素,重复该步骤,直到bufferbuffer均已被填满;
  2. 选择层数较低的两个bufferbuffer来生成新bufferbuffer

示例

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

相关文章:

猜你喜欢
  • 2022-12-23
  • 2021-04-27
相关资源
相似解决方案