兩個有意思的編碼算法

最近在看《Column-Stores vs. Row-Stores: How Different Are They Really?》, 發現里面提到了列式數據庫使用了編碼(壓縮)算法來減少查詢時候的I/O消耗,因此找了兩種有意思的編碼算法: Run length encodingDictionary encoding找出來學習了一下。

Run Length Encoding

Run Length Encoding(RLE)是無損壓縮的一種,這種壓縮方法在數據連續重復的情況較多的時候比較有用,比如下面的數據:

WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW

利用RLE會被壓縮成:

12W1B12W3B24W1B14W

意思是說: 12個W,一個B,12個W, 3個B,24個W,1個B,14個W。原來需要67個字符表示的字符串,利用RLE之后只需要18個字符。

Dictionary Encoding

字典編碼也稱為替換編碼,也是無損數據壓縮的一種。它維護一個字典,在編碼的時候把要編碼的字符串轉換成字典里面這個字母對應的下標,而解碼的時候這從這個下標還原成原來的字符。我們余則成同志跟組織聯系使用的就是這個字典編碼:

字典編碼在《潛伏》中的應用

字典編碼分為兩類,分類的依據是所依賴的字典是靜態的還是動態的。上面的例子里面則成通知使用的書(好像是《康熙字典》之類的)就是靜態的字典。靜態字典應用的場景一般是要編碼的字符比較固定,并且內容很長;跟靜態字典相對應的是動態字典, 所謂的動態字典是在編碼的過程中動態構建出來的,一開始字典是空的,輸入的字符越來越多,這個字典也就越來越豐富。(具體的構建過程就不詳細介紹了)

字典編碼的關鍵是編碼之后輸出的不再是原來的字符了,而是代表這個字符的引用(通常是下標),而且可以把多個字符編碼成一個數字,因為數字比字符串占用的空間小,因此也就達到了編碼的目的。

參考資料

  1. Column-Stores vs. Row-Stores: How Different Are They Really?
  2. Run Length Encoding
  3. Dictionary encoding
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 個人筆記,方便自己查閱使用 Py.LangSpec.Contents Refs Built-in Closure ...
    freenik閱讀 67,768評論 0 5
  • 編碼問題一直困擾著開發人員,尤其在 Java 中更加明顯,因為 Java 是跨平臺語言,不同平臺之間編碼之間的切換...
    x360閱讀 2,506評論 1 20
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 精力充沛的孩子,經常不顧父母的感受。他們會在沙發上跳來跳去;拿個足球在客廳里踢;或者當家里來客人的時候大喊大...
    方策家族閱讀 189評論 1 3