基於Huffman和LZ77的文件壓縮(一)Huffman壓縮

點我獲取代碼

1 壓縮的優點
1 節省空間
2 提高文件在網絡上的傳輸效率
3 壓縮可以形成一定程度上的加密。

2 文件壓縮的分類
1 有損壓縮
2 無損壓縮

無損壓縮: 通過解壓之後 能形成和源代碼一木一樣的壓縮方式。
有損: 解壓縮之後和源文件格式不完全相同,但基本不影響。例如 視頻的清晰度。

先大概瞭解

	LZ77  基於語句 ,用<長度,距離, 下一個字符> 替換重複出現的語句

**LZ77的變形 **:原理:將重複多次出現的語句用盡可能短的標記來替換。

eg :asdfghjkl1234asdfgh0
asdfghjkl1234(連着重複出現的個數,當前位置向前數距離)0

LZ77消除了文件中重複出現的語句,但還存在字節之間的重複 ,因此再用哈夫曼編碼壓縮一次。

Huffman壓縮

哈夫曼編碼

哈夫曼編碼是可變字長編碼,該方法完全依據字符出現概率來構造異字頭的平均長度最短的碼字

Huffman壓縮:基於字節

1 個字節 == 8個比特位,如果對每個字節都能找到更好的改寫方法改寫原數據,就可以達到壓縮的目的。

舉個栗子🌰:
文件 :ABBBCCCCCDDDDDDD
提供這樣的哈夫曼編碼
eg: A: 00
B: 01
C: 10
D: 11
來一組字符串 ,就會進行相應的替換。大大節省空間

這種Huffman壓縮之後,大小原來的1/4

還存在不等長編碼:
A: 100
B:101
C:11
D:0

這樣的話,D出現次數處越多,壓縮的效果就越好。

如果將C的編碼改成10,那麼就成了A 或B的編碼前綴,壓縮時不會出現問題,但解壓縮可能會出問題,遇見10 就不知道怎麼解析。

ABBBCCCCCDDDDDDD
在這裏插入圖片描述

什麼是huffman哈夫曼樹

帶權路徑最小的二叉樹爲哈夫曼樹

帶權路徑長度WPL:
WPL = 所有葉子的權 * 根到該葉子的路徑長度 之和

Hffman壓縮四部曲:

1 : 統計每個字符出現的次數
2 : 創建哈夫曼樹:
3 :獲取字符的編碼(二進制串)
4 : 用編碼改寫源文件

核心:Huffman 樹的構建

1 提供一組字符權值(出現的次數)

2 以每個權值爲節點,創建n顆只有根節點的二叉樹的森林

3 如果森林超過兩棵樹 ,進行以下操作:
a: 從森林中每次取出兩顆根節點權值最小的二叉樹

b:以這兩顆二叉樹作爲某個節點的左右子樹,創建出一顆新的二叉樹,新二叉樹權值爲左右子樹權值之和。

c: 將新創建的二叉樹插入到森林中,直到二叉樹森林中只剩一棵樹。

點我繼續閱讀

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