0.前言
本文主要介绍Zhang and Wang利用GK Summary的Merge与Prune操作来构建新的
1.算法思路
Zhang and Wang在论文先描述:1)数据量固定的算法,即已知数据量
1.1 数据量固定的算法
首先考虑:数据量固定场景,论文提出多层
其中
for ( i = i; i ≤ N; i++ )
{
insert vi into s0; //新进数据直接插入s0
if ( |s0| < b ) //s0没满,则继续插入
contiune;
sort s0; //s0满了,则排序并执行compress操作
sc = compress(s0, 1/b); //生成sc,1/b为prune增加误差,对应生成b/2个元素,s0误差为0
s0 = ∅;
for ( k = 1; k <= L; k++ )
{
if ( |sk| == 0 ) //sk是否为空
{
sk = sc; //为空,则加入sc
break;
} else {
tmp = merge(sk, sc); //否则,sc与sk进行merge,此时对应误差max(ϵk, 1/b)
sc = compress(tmp, 1/b); //ϵk为sk的误差,继续compress,max(ϵk, b/2) + 1/b
sk = ∅ //sk置空,可以归纳出,sk存在summary时,误差为k*(1/b)
} //上层误差比下层大。
}
}
方便理解,对应图示如下:
证明:对于第
对于第
最终查询时,会将所有层的
上述可见,
1.2 数据量固定的算法复杂度
论文给出算法的空间复杂度为:
GK Summary算法的空间复杂度
论文给出平均每个元素
算法主要是
1.3 流式数据算法
现在考虑流式数据场景,论文将流式数据进行分阶段进行构建summary,将流按照对于大小来分段。阶段1为
算法流程如下:
S = ∅;SC = ∅; k = 0; N = 1/ε; //初始化值
while ( not EOS )
{
e = next element in stream; //流式系统新数据
n++;
SC = Update(e, SC, ε/2); // 调用上述固定长度的fast quantile算法,生成对应summary
if ( n == N) // 第i阶段结束
{
// 下面过程生成第i阶段的summary SC,误差边界ε/2
s_all = s0;
for ( i = 1; i <= L; i++ )
{
s_all = Merge(s_all, si);
}
Sk = compress( s_all, ε/2); // 将summary compress到2/ε,减少summary数
S = S ∪ Sk; // 合并所有阶段summary
SC = ∅; // 重置
n = 0;
N = 2×N;
}
}
生成最终
// 直接结束当前阶段,生成summary
if ( SC != empty; )
{
s_all = s0;
for ( i = 1; i <= L; i++ )
{
s_all = Merge(s_all, si);
}
Sk = compress( s_all, ε/2 );
}
// merge所有的阶段的summary
S = S0
for ( i = 1; i ≤ k; i++ )
S = Merge(S, Si);
1.4 流式算法复杂度分析
论文给出空间复杂度:
参考文献
- A fast algorithm for approximate quantiles论文: https://pdfs.semanticscholar.org/03a0/f978de91f70249dc39de75e8958c49df4583.pdf
- Emory大学Stream DB System课程关于A Fast Algorithm算法材料:
http://www.mathcs.emory.edu/~cheung/Courses/584-StreamDB/Syllabus/08-Quantile/Zhang.html - Emory大学Stream DB System课程关于A Fast Algorithm算法材料:
http://www.mathcs.emory.edu/~cheung/Courses/584-StreamDB/Syllabus/08-Quantile/Zhang2.html