Fast Algorithm for GK Summary算法


0.前言

  本文主要介紹Zhang and Wang利用GK Summary的Merge與Prune操作來構建新的ϵapproximate quantile summary ,提出了A Fast quantile summary algorithm,速度非常快,注意本文的Compress操作即爲Prune操作,因爲論文使用該名詞,保持一致。本文僅提取出關鍵內容加入筆者的個人理解,有錯誤還望諒解與告知。

1.算法思路

  Zhang and Wang在論文先描述:1)數據量固定的算法,即已知數據量N 。2)通過數據流分階段,每個階段數據量固定,因此可以將算法擴展到流式數據庫場景,而不依賴先驗的數據量N

1.1 數據量固定的算法

  首先考慮:數據量固定場景,論文提出多層quantile summary 結構:

S={s0,s1,...,sL}

  其中si 爲第i 級的quantile summaryb=log(ϵN)/ϵ ,爲每級summary 的最大個數,算法流程如下:
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)
        }                              //上層誤差比下層大。
     }
}

  方便理解,對應圖示如下:


這裏寫圖片描述

  證明:對於第k 層,出現滿的狀態,需要數據量爲N/(2k×b) 個數據。因此,L 層的summaryL 層最多隻能1次爲滿,則:
N/(2L×b)12LN/bLlog(N/b)          (b=log(ϵN)/ϵ)=log(ϵN/log(ϵN))=log(ϵN)log(log(ϵN))<log(ϵN)

  對於第k 層,對應誤差爲ϵk=k/b , 最大誤差是L 層對應ϵL :

sL=L/log(ϵN)/ϵ<log(ϵN)/(log(ϵN)/ϵ)<ϵ

  最終查詢時,會將所有層的summary merge 一起:

S=Merge(s0,s1,...,sk)

  S 誤差約束:

ϵ=max(ϵ0,ϵ1,...,ϵk)=sL<ϵ

  上述可見,b 設置極其巧妙。

1.2 數據量固定的算法複雜度

  論文給出算法的空間複雜度爲:

O(bL)=log(ϵN)/ϵ×log(N/b)log2(ϵN)/ϵ

  GK Summary算法的空間複雜度O(log(ϵN)/ϵ) , 可見Fast的算法複雜度更優。

  論文給出平均每個元素summary 更新時間複雜度爲:O(log(log(ϵN)/ϵ)) ,幾乎近似於常熟複雜度。時間複雜度等價於GK Summary最好情況的複雜度,而GK Summary最差情況的複雜度爲O(log(ϵN)/ϵ)時間複雜度證明:

  算法主要是s0 執行compress ,從無序數據到有序的summary ,因此s0 只需要排序+compress ,每次排序複雜度是blogb , compressb/2 , 總共需要執行N/b 次。而對於其他層(i>0 ),因爲merge 下層summary 已經是有序,因此對於第i 層來說需要簡單merge+compressmerge 複雜度爲2b , compress 複雜度爲b,需要執行N/(2ib) ,因此計算時間爲:

Nlogb+N/2+i=1LN2ib3b=O(Nlog(log(ϵN)/ϵ))

1.3 流式數據算法

  現在考慮流式數據場景,論文將流式數據進行分階段進行構建summary,將流按照對於大小來分段。階段1爲0 ~1/ϵ 數據,階段2爲1/ϵ ~3/ϵ 數據,階段n 對應(2n11)/ϵ ~(2n1)/ϵ 數據。數據流式不斷增加,對應n 也不斷變大,每個階段,數據長度是固定的,階段i ,數據長度爲定值2i1/ϵ 。因此,可以套用上述講到的數據量固定算法,具體思路是將每個階段生成的誤差邊界都保持在ϵ ,但是卻是通過Compress(Merge(s0,s1,...sL),ϵ/2) (不同於直接限定誤差ϵ ,只需要進行merge,compress操作能減少summary個數),每個階段生成2/ϵ+1summary ,最終merge每個階段生成的summary ,情況如下圖所示。


這裏寫圖片描述

  算法流程如下:


  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 算法如下:

// 直接結束當前階段,生成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 流式算法複雜度分析

  論文給出空間複雜度:O(log2(ϵN)/ϵ) , 時間複雜度爲:O(log(log(ϵN)/ϵ)) ,證明:整個過程等價於最新階段summary 計算複雜度。


參考文獻

  1. A fast algorithm for approximate quantiles論文: https://pdfs.semanticscholar.org/03a0/f978de91f70249dc39de75e8958c49df4583.pdf
  2. Emory大學Stream DB System課程關於A Fast Algorithm算法材料:
    http://www.mathcs.emory.edu/~cheung/Courses/584-StreamDB/Syllabus/08-Quantile/Zhang.html
  3. Emory大學Stream DB System課程關於A Fast Algorithm算法材料:
    http://www.mathcs.emory.edu/~cheung/Courses/584-StreamDB/Syllabus/08-Quantile/Zhang2.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章