無損數據壓縮 Lossless Compression

    最近看了名爲一部《硅谷》的美劇,講述了硅谷的一個創業故事。它們公司的一個創新點就是數據壓縮。在當前大數據的背景下,數據壓縮一方面有利於數據的存儲、另一方面有利於數據的傳播。無損壓縮是要的保證信息不丟失的前提下儘可能的將數據變得更小,因爲信息不丟失,所以能夠完整的恢復回壓縮之前狀態。

    數據壓縮算法的一個特點就是要去尋找原始數據中的規律,從而設計最優化的編碼。對於不同類型的文件,比如音頻、視頻、圖片文件,各自有着自己的數據特點,因此能夠爲之設計出不同的適合各自的壓縮算法。本文要講的是通用的三種的經典無損壓縮算法,分別是Shannon-Fano 編碼,Huffman 編碼,LZW(Lempel-Ziv-Welch) 編碼。


    Shannon-Fano算法
    香農-範諾算法的核心是分治後編碼。每次進行二分然後編碼,這使得編碼能夠保證互不爲前綴,且頻度高的編碼儘量短。
Shannon-Fano算法的主要步驟:
1. 統計每種字符(1個字節)的頻度,對其從大到小排序,構成一個降序數組。
2. 二分劃分,使得左右兩側的頻度和儘可能接近。然後分配一個編碼位,左邊分配0、右邊分配1,然後遞歸繼續劃分。
3. 直到劃分到只有1個字符爲止。
    壓縮成的文件:
壓縮文件要寫入每個編碼對應的原字符,這樣才能夠完成解壓縮。
  

    Huffman 壓縮算法

    霍夫曼算法的核心是根據每種字符(1個字節)在文件中的出現頻率來設計一套互相不爲前綴的霍夫曼編碼。出現頻率越高的字符,其編碼會越短,從而到達壓縮的目的。

Huffman算法的主要步驟:

1. 統計每個字符的出現頻度。
2. 按頻度合併構造出霍夫曼二叉樹。
3. 由二叉樹生成每個字符對應的非前綴二進制編碼。

    壓縮成的文件:

壓縮文件中要寫入每個編碼對應的原字符,這樣才能夠完成解壓縮。


    LZW 壓縮算法
    LZW的全稱是Lempel-Ziv-Welch,它是在掃描動態過程動態生成字符串(字節長度不限)的編碼,並在之後的掃描中使用編碼。
LZW算法的主要步驟:
1. 建立一個壓縮字典,開始對文件順序掃描。
2. 遇到第一次出現的字符串時,把它放入壓縮字典中,並用一個編碼來表示,這個編碼與此字符串在串表中的位置有關,並將這個編碼存入壓縮文件中。
3. 遇到不是第一次出現的字符串時,即可用壓縮字典中的對應編碼來代替,並將這個編碼存入文件中。
    壓縮成的文件:
壓縮完成後可將壓縮字典丟棄,不需要存入壓縮文件,因爲解壓過程會重新掃描並生成和壓縮過程時一樣的壓縮字典。


稍後會在Github上貼出了三種壓縮算法的實現,點這裏
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章