有趣的赫夫曼樹

2022-04-02 09:02:21 字數 1644 閱讀 4131

美國有個數學家叫赫夫曼,60年前他根據資料的使用概率,發明了乙個二叉樹叫赫夫曼樹。

這個赫夫曼樹被用在了資料壓縮上,被稱為赫夫曼編碼,這是後來壓縮的基礎。

他解決的問題主要思想是:根據元素出現的概率,獲得最優解。

舉例如下:

學生考試成績出來後,會根據考試成績分等級,極優秀,優秀,中等,及格,不及格。如果我們按照普通邏輯進行判斷時,通常是:

if (score < 60)  else if (score < 70)  else if (score < 80)  else if (score < 90)  else if (score < 100)
但是按照分數的分布概率,優秀:30%,中等:40%,及格:15%,極優秀:10%,不及格:5%

如果先判斷優秀,中等,再判斷極優秀,極優秀,不及格,則可以提高很多效率。

赫夫曼樹就是根據概率來生成的二叉樹。

轉換成二叉樹區別如下:

從根節點出發,遍歷每乙個葉子節點,是的到達節點時走的鏈結樹乘以節點(nodelinknum * weight)對應的權重之和最小

如:sum = 1*5+2*15+3*40+4*30+4*10

顯然,左圖和右圖總和不一樣,左圖的和大於右圖.

那給你一組數字,怎麼構造乙個赫夫曼樹呢?

1.先把所有的資料節點,從小到大依次排列,成為乙個有序列表

2.取出前面兩個節點,讓這兩個節點的權重資料相加得到乙個和,令這個和為根節點,這個兩個節點的小的為其左孩子,大的為其右孩子

3.令這個和節點替換掉前面的兩個節點,並重新排序,生成乙個有序列表

4.不斷重複第二步,第三步。直到所有的節點都被用完,得到乙個排序結果,此時生成的二叉樹,就是赫夫曼樹。

赫夫曼樹的實際應用:壓縮資料

資料在計算機的表示形式是0,1,那麼一串字串的表示是怎麼樣的呢

例如abcdef編碼如下:

那麼要表示字串「badcadfeed」的二進位制為:「001000011010000011101100100011」。

但是abcdef做為基本字元,在這串字串中的出現概率是不一樣的,那麼我們是否可以以概率做為字元權重,對字元生成赫夫曼樹呢

假設六個字母的頻率為a 27,b 8,c 15,d15,e 30,f 5,合起來正好是100%。那就意味著,我們完全可以重新按照赫夫曼樹來規劃它們。

將權值左分支改為0,右分支改為1後的赫夫曼樹。

根據重新編碼後為:

1001010010101001000111100(共25個字元)

而原來的字元編碼為:

「001000011010000011101100100011」(共30個字元)

壓縮了近17%

解壓時,按照同樣的規則,還原原字串。

哈夫曼樹,赫夫曼樹

參考 赫夫曼樹,別名 哈夫曼樹 最優樹 以及 最優二叉樹 當用 n 個結點 這些結點都作為葉子結點且都有各自的權值 試圖構建一棵樹時,如果構建的這棵樹的帶權路徑長度最小,稱這棵樹為 最優二叉樹 有時也叫 赫夫曼樹 或者 哈夫曼樹 構建哈夫曼樹 在 n 個權值中選出兩個最小的權值,對應的兩個結點組成乙...

赫夫曼樹 樹

在資料膨脹,資訊 的今天,資料壓縮的意義不言而喻。談到資料壓縮,就不能 不提赫夫曼編碼,赫夫曼編碼是首個使用的壓縮編碼方案,即使在今天的知名壓縮演算法裡,依然可以見到赫夫曼編碼的影子。另外,在資料通訊中,用二進位製給每個字元進行編碼時不得不面對乙個問題是如何使電文總長最短且不產生二義性。根據字元出現...

樹 赫夫曼樹

幾個概念 wpl最小的就是赫夫曼樹 赫夫曼樹的建立 將數列 轉成一顆赫夫曼樹的過程 將數列元素從小到大排序 取出最小的兩個元素,生成一棵新的二叉樹,取出的兩個元素作為新二叉樹的子節點 一般權重小的作為子節點 根節點的權重為子節點權重之和 將處理過的兩個元素從列表中刪除,將新的根節點加入列表 重複1 ...