[差量更新系列1]BSDiff算法學習筆記

BSDiff是一個差量更新算法,它在服務器端運行BSDiff算法產生patch包,在客戶端運行BSPatch算法,將舊文件和patch包合成新文件。

差量更新算法的核心思想 儘量多的利用old文件中已有的內容,儘量少的加入新的內容來構建new文件。一般的作法是對old文件和new文件作子字符串匹配或使用hash技術,提取公共部分,將new文件中剩餘的部分打包成patch包,在Patch階段中,用copying和insertion兩個基本操做便可將old文件和patch包合成new文件。算法

BSDiff算法的改進 Insertion操做會引發大量的指針變更和修改,要記錄這些值才能在Patch階段給修改過的區域從新定位,因爲這些指針控制字必須在BSDiff階段加入patch包,產生的patch包會較大。BSDiff經過引入diff string的概念,大大減小了要記錄的指針控制字的數目,從而使得patch包更小。數組

基本定義服務器

BSDiff基本步驟 BSDiff的三個基本步驟以下:指針

1.對old文件中全部子字符串造成一個字典; 2.對比old文件和new文件,產生diffstring和extra string; 3.將diffstring 和extra string 以及相應的控制字用zip壓縮成一個patch包。code

步驟1.是全部差量更新算法的瓶頸,時間複雜度爲O(nlogn),空間複雜度爲O(n),n爲old文件的長度。BSDiff採用 Faster suffix sorting方法得到一個字典序,使用了相似於快速排序的二分思想,使用了bucket,I,V三個輔助數組。最終獲得一個數組I,記錄了之前綴分組的各個字符串組的最後一個字符串在old中的開始位置 步驟2.是BSDiff產生patch包的核心部分,詳細描述以下:排序

步驟3.將diff string 和extrastring 以及相應的控制字用zip壓縮成一個patch包。圖片

能夠看出在用zip壓縮以前的patch包是沒有節約任何字符的,但diff strings能夠被高效的壓縮,故BSDiff是一個很依賴於壓縮與解壓的算法!ip

BSPatch基本步驟 客戶端合成patch的基本步驟以下:字符串

1.接收patch包; 2.解壓patch包; 3.還原new文件。get

三個步驟同時在O(m)時間內完成,但在時間常數上更依賴於解壓patch包的部分,m爲新文件的長度

複雜度分析 根據以上步驟,不可貴出BSDiff與BSPatch的時間與空間複雜度以下:

BSDiff 時間複雜度 O(nlogn) 空間複雜度 O(n) BSPatch 時間複雜度 O(n+m) 空間複雜度 O(n+m)

另外給出BSDiff壓縮效率實驗數據:

圖片來源:CompressingDifferences of Executable Code

參考文獻 Naïve Differences of ExecutableCode https://www.researchgate.NET/publication/2890146_Naive_Differences_of_Executable_Code Compressing Differences ofExecutable Code https://www.researchgate.Net/publication/2379631_Compressing_Differences_of_Executable_Code

相關文章
相關標籤/搜索