霍夫曼樹 是由美國計算機科學家大衛·霍夫曼(David Albert Huffman)(又譯爲哈夫曼、赫夫曼)在1952年發明霍夫曼編碼所用到的特殊二叉樹。爲了記念他的成就,因而就叫 霍夫曼樹,他的編碼方法稱爲 霍夫曼編碼。安全
從二叉樹中一個節點到另外一個節點之間的分支構成兩個節點之間的路徑,路徑上的分支數目稱作路徑長度。樹的路徑長度就是從樹根到每一節點的路徑長度之和。微信
在帶有權重的節點中,節點帶權的路徑長度是從該節點到樹根之間的路徑長度與節點上權的乘積。樹的帶權路徑長度是樹中全部葉子節點的帶權路徑長度之和。其中帶權路徑長度最小的二叉樹稱作 霍夫曼樹,也稱爲 最優二叉樹。網絡
1.先把有權值的葉子節點按照從小到大的順序排列成一個有序序列。
2.取前兩個最小權值的節點做爲一個新節點(T1)的兩個子節點,注意相對較小的是左節點,稍大點的是右節點。
3.把 T1 2個子節點的和,加入到剩餘有序序列中,按第二步的規則構建新的節點。
4.重複第三步,直到連上全部節點爲止。這棵樹即是 霍夫曼樹。編碼
按照須要編碼的字符集的權值來構造一棵 霍夫曼樹。規定霍夫曼樹的左分支表明 0,右分支表明 1,則從根節點到葉子節點所通過的路徑分支組成的0和1的序列便爲該結點對應字符的編碼,這就是 赫夫曼編碼。設計
好比如今有一段內容「ACBDEDABDA」須要傳輸。假設一個字母佔 3 位,A=000,B=001,C=010,D=011,E=100。那麼這段內容的編碼是 000010001011100011000001011000(佔 30 位)。cdn
假設 ABCDE 的權重分別爲 32,20,10,30,8。那麼構建好霍夫曼樹後 A=11,B=01,C=001,D=10,E=000。霍夫曼樹編碼內容是 1100101100001011011011(佔 22 位)。blog
構建好的霍夫曼樹 資源
根據霍夫曼樹轉換的編碼 根據上面例子,用霍夫曼編碼,節省了 8 位。說明數據被壓縮了,節約了大約 27% 的存儲或傳輸成本。隨着字符的增長和多字符權重的不一樣,這種壓縮會更加顯出其優點。編碼中非0即1,長短不等的話實際上是很容易混淆的,因此若要設計長短不等的編碼,則必須是任一字符的編碼都不是另外一個字符的編碼的前綴,這種編碼稱作前綴編碼。it
在解碼時,仍是要用到霍夫曼樹,即發送方和接收方必需要約定好一樣的霍夫曼編碼規則。io
霍夫曼樹 是根據權重來構建的二叉樹,咱們也稱爲 最優二叉樹。
它的主要做用是用來編碼,也能夠用來壓縮數據。也可用來編碼以後傳送給第三方,提高安全性和節省網絡資源,而後在根據雙方約定好的 霍夫曼樹 進行解碼,能夠作到無損編碼和無錯解碼。
PS:
清山綠水始於塵,博學多識貴於勤。
我有酒,你有故事嗎?
微信公衆號:「清塵閒聊」。
歡迎一塊兒談天說地,聊代碼。