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