資料結構與演算法 霍夫曼樹 霍夫曼編碼和解碼

2021-10-25 10:55:16 字數 2072 閱讀 7489

找出存放一串字元所需的最少的二進位制編碼。

首先統計出每種字元出現的頻率,即:概率、權值。

例如:頻率表 a:60,    b:45,   c:13   d:69   e:14   f:5  g:3

第一步:找出字元中頻率最小的兩個,小的在左邊,大的在右邊,組成二叉樹。在頻率表中刪除此次找到的兩個數,並加入此次最小兩個數的頻率和。

f 和 g 最小,如下圖所示,從字串頻率計數中刪除 f 與 g,並返回 g 與 f 的和 8 給頻率表。

第二步:頻率表 a:60,    b:45,   c:13   d:69   e:14   fg:8

頻率最小的是 fg:8 與 c:13,如下圖所示,並返回 fgc 的和 21 給頻率表。

第三步:頻率表 a:60    b: 45   d: 69   e: 14   fgc: 21

如圖

頻率表 a:60    b: 45   d: 69  fgce: 35

頻率表 a:60   d: 69  fgceb: 80

頻率表 ad:129  fgceb: 80

新增 0 和 1,規則左 0 右 1 。

頻率表 a:60,    b:45,   c:13   d:69   e:14   f:5  g:3

每個字元的二進位制編碼為(從根節點到對應的葉子節點,路徑上的值拼接起來就是葉子節點字母的應該的編碼)

字元編碼a10

b01c0011d11

e000

f00101

g00100

那麼當我想傳送 abc 時,編碼為 10 01 0011,該編碼就是 霍夫曼編碼 。

對於解碼操作來說,編碼接收方同時接收到編碼中對應的字元列表以及各個字元的概率值,重新建立霍夫曼樹,從而根據編碼每次從樹的根遍歷至樹的葉子節點,最終還原整個字串。

1、出現得越多的字母,他的編碼越短 ;出現頻率越少的字母,他的編碼越長。

在資訊傳輸過程中,如果這個字母越多,那麼我們希望他越瘦小(編碼短)這樣占用的編碼越少,其實編碼長的字母也是讓頻率比它多的字母把編碼短的位子都占用後,他才去占用當前最短的編碼。至此讓總的編碼長度最短。

實際上這就是貪心演算法。

2、保證長編碼的不與短編碼的字母衝突。

比如不能出現讀碼讀到 01 還有長編碼的字母為 011,如果短編碼為乙個長編碼的左起子串,這就是衝突,意思就是說讀到當前位置已經能確定是什麼字母時不能因為再讀取一位或幾位讓這個編碼能表示另外的字母。

哈夫曼樹(最優二叉樹)在構造的時候避免了這個問題。為什麼能避免呢,因為哈夫曼樹的它的字母都在葉子節點上,因此不會出現乙個字母的編碼為另乙個字母編碼左起子串的情況。

3、霍夫曼樹不是唯一的。

同一字串,可以構建出不同的霍夫曼樹,例如將上例的構建規則改為頻率較低的放在右邊,頻率較高的放在左邊,這樣構建的樹就不同了。總的來說這叫同權不同構。

典型的應用場景就是資料壓縮,壓縮乙個 txt 檔案,將其二進位制轉成 base 64 編碼,對該編碼串建立霍夫曼樹,從而可以得到霍夫曼編碼。該編碼相對於原 base 64 串來說體積小很多,從而達到了資料壓縮的目的。

在實際編碼過程中,如何快速找到頻率表中最小的兩個值呢,這裡可以採用 堆結構 來實現。

(saw:game over!)

資料結構 霍夫曼樹

帶權路徑長度最小的樹,常用於資料通訊中。構造霍夫曼樹演算法 設給定的一組權值為,據此生成森林f f 中的沒棵二叉樹只有乙個帶權為w1的根節點 i 1,2,n 在f中選取兩棵根節點的權值最小和次小的二叉樹作為左右構造一棵新的二叉樹,新二叉樹根節點的權值為其左 右子樹根節點的權值之和。在f中刪除這兩棵最...

資料結構 六 霍夫曼樹與編碼

1 演算法流程 1 構建霍夫曼樹 自底向上 根據統計頻率構建霍夫曼樹 a 把所有的節點扔進排序佇列queue 中 b 從queue 選擇選擇前面兩個最小的元素a b,把最小的樹 a作為左節點,把最小的 b作為右節點,以此構建父節點 c c的頻率值為 a b的頻率值 然後把a b從佇列刪除 把 c節點...

資料結構之樹(五)霍夫曼編碼樹

1 概述 霍夫曼編碼是一種基於最小冗餘編碼的壓縮演算法。最小冗餘編碼是指,如果知道一組資料中符號出現的頻率,就可以用一種特殊的方式來表示符號從而減少資料需要的儲存空間。2 定義 霍夫曼樹 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹...