算法與數據結構學習(42)-赫夫曼編碼

在這裏插入圖片描述

赫夫曼編碼基本介紹

1.赫夫曼編碼也翻譯爲 哈夫曼編碼(Huffman Coding),又稱霍夫曼編碼,是一種編碼方式, 屬於一種程序算法

2.赫夫曼編碼是赫哈夫曼樹在電訊通信中的經典的應用之一。

3.赫夫曼編碼廣泛地用於數據文件壓縮。其壓縮率通常在20%~90%之間

4.赫夫曼碼是可變字長編碼(VLC)的一種。Huffman於1952年提出一種編碼方法,稱之爲最佳編碼

原理剖析

通信領域中信息的處理方式1-定長編碼

  • i like like like java do you like a java // 共40個字符(包括空格)

  • 105 32 108 105 107 101 32 108 105 107 101 32 108 105 107 101 32 106 97 118 97 32 100 111 32 121 111 117 32 108 105 107 101 32 97 32 106 97 118 97 //對應Ascii碼

  • 01101001 00100000 01101100 01101001 01101011 01100101 00100000 01101100 01101001 01101011 01100101 00100000 01101100 01101001 01101011 01100101 00100000 01101010 01100001 01110110 01100001 00100000 01100100 01101111 00100000 01111001 01101111 01110101 00100000 01101100 01101001 01101011 01100101 00100000 01100001 00100000 01101010 01100001 01110110 01100001 //對應的二進制

  • 按照二進制來傳遞信息,總的長度是 359 (包括空格)

  • 在線轉碼工具

通信領域中信息的處理方式2-變長編碼

  • i like like like java do you like a java // 共40個字符(包括空格)

  • d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9 // 各個字符對應的個數

  • 0= , 1=a, 10=i, 11=e, 100=k, 101=l, 110=o, 111=v, 1000=j, 1001=u, 1010=y, 1011=d 說明:按照各個字符出現的次數進行編碼,原則是出現次數越多的,則編碼越小,比如 空格出現了9 次, 編碼爲0 ,其它依次類推.

  • 按照上面給各個字符規定的編碼,則我們在傳輸 “i like like like java do you like a java” 數據時,編碼就是 10010110100…

  • 字符的編碼都不能是其他字符編碼的前綴,符合此要求的編碼叫做前綴編碼, 即不能匹配到重複的編碼(這個在赫夫曼編碼中,我們還要進行舉例說明, 不捉急)

在這裏插入圖片描述

通信領域中信息的處理方式3-赫夫曼編碼

赫夫曼編碼原理

  1. i like like like java do you like a java

  2. d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9 // 各個字符對應的個數

  3. 按照上面字符出現的次數構建一顆赫夫曼樹, 次數作爲權值

  4. 根據赫夫曼樹,給各個字符,規定編碼 (前綴編碼), 向左的路徑爲0 向右的路徑爲1 , 編碼如下:
    o: 1000 u: 10010 d: 100110 y: 100111 i: 101
    a : 110 k: 1110 e: 1111 j: 0000 v: 0001
    l: 001 : 01

  5. 按照上面的赫夫曼編碼,我們的"i like like like java do you like a java" 字符串對應的編碼爲 (注意這裏我們使用的無損壓縮)
    1010100110111101111010011011110111101001101111011110100001100001110011001111000011001111000100100100110111101111011100100001100001110 通過赫夫曼編碼處理 長度爲 133

6) 長度爲 : 133
說明:原來長度是 359 , 壓縮了 (359-133) / 359 = 62.9%
此編碼滿足前綴編碼, 即字符的編碼都不能是其他字符編碼的前綴。不會造成匹配的多義性
赫夫曼編碼是無損處理方案

注意
, 這個赫夫曼樹根據排序方法不同,也可能不太一樣,這樣對應的赫夫曼編碼也不完全一樣,但是wpl 是一樣的,都是最小的, 比如: 如果我們讓每次生成的新的二叉樹總是排在權值相同的二叉樹的最後一個,則生成的二叉樹爲:
在這裏插入圖片描述

構建赫夫曼樹的步驟

  1. 從小到大進行排序, 將每一個數據,每個數據都是一個節點 , 每個節點可以看成是一顆最簡單的二叉樹
  2. 取出根節點權值最小的兩顆二叉樹
  3. 組成一顆新的二叉樹, 該新的二叉樹的根節點的權值是前面兩顆二叉樹根節點權值的和
  4. 再將這顆新的二叉樹,以根節點的權值大小 再次排序, 不斷重複 1-2-3-4 的步驟,直到數列中,所有的數據都被處理,就得到一顆赫夫曼樹
    在這裏插入圖片描述

最佳實踐-數據壓縮(創建赫夫曼樹)

將給出的一段文本,比如 “i like like like java do you like a java” , 根據前面的講的赫夫曼編碼原理,對其進行數據壓縮處理 ,形式如 "1010100110111101111010011011110111101001101111011110100001100001110011001111000011001111000100100100110111101111011100100001100001110
"

思路:

  1. Node { data (存放數據), weight (權值), left 和 right }
  2. 得到 “i like like like java do you like a java” 對應的 byte[] 數組
  3. 編寫一個方法,將準備構建赫夫曼樹的Node 節點放到 List , 形式 [Node[date=97 ,weight = 5], Node[]date=32,weight = 9]…], 體現 d:1 y:1 u:1 j:2 v:2 o:2 l:4 k:4 e:4 i:5 a:5 :9
  4. 可以通過List 創建對應的赫夫曼樹
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章