6 10哈夫曼編碼與構造

2021-10-06 19:30:16 字數 2406 閱讀 4444

哈夫曼編碼

由於哈夫曼樹是具有相同葉子個數的二叉樹中帶權路徑長度最小的二叉樹,涉及求根據給定葉子(帶權)求其「規模最小」的二叉樹問題,用哈夫曼樹構造哈夫曼編碼就是其典型應用。

用電子方式處理符號時,需先對符號進行二進位制編碼。例如,在計算機中使用的英文本 符的 ascii 編碼就是 8 位二進位制編碼,ascii 編碼是一種定長編碼,即每個字元用相同數目的二進位制位編碼。

為了縮短資料檔案(報文)長度,可採用不定長編碼。其基本思想是,給使用頻度較高 的字元編以較短的編碼。這是資料壓縮技術的最基本的思想。如何給資料檔案中的字元編以不定長編碼,使各種資料檔案平均最短呢?這也是個與哈夫曼樹相關的最優問題。通過例項介紹概念。

下面給出哈夫曼編碼的相關特性。

定理 6-1哈夫曼編碼是字首碼。

定理 6-2哈夫曼編碼是最優字首碼。

即對於 n 個字元,分別以它們的使用頻度為葉子權構造哈夫曼樹,則該樹對應的哈夫曼編碼能使各種報文(由這 n 種字元構成的文字)對應的二進位制串的平均長度最短。

由哈夫曼樹的構造方法知,使用頻度較高的字元對應的編碼較短,這也直觀地說明了本定理。

哈夫曼樹被廣泛的應用,最典型的就是在編碼技術上的應用。利用哈夫曼樹,可以得到平均長度最短的編碼。

研究操作碼的優化問題主要是為了縮短指令字的長度,減少程式的總長度以及增加指令所能表示的操作資訊和位址資訊。要對操作碼進行優化,就要知道每種操作指令在程式 中的使用頻率。這一般是通過對大量已有的典型程式進行統計得到的。

這裡以計算機操作碼的優化問題為例來分析說明。

例 6-7 設有一台模型機,共有 7 種不同的指令,其使用頻率如表 6-5 所示

由於計算機內部只能識別 0、1 **,所以若採用定長操作碼,則需要 3 位(23=8)。 一段程式中若有 n 條指令,每條指令編碼佔 3 位,那麼程式的總位數為 3×n。為了充分地 利用編碼資訊和減少程式的總位數,我們可以採用變長編碼。如果對每一條指令指定一條編碼,並使這些編碼互不相同且最短,是否可以滿足要求呢?可否採用如表 6-6 所示這樣編碼呢?

這樣雖然可以使得程式的總位數達到最小,但機器卻無法解碼。例如,對編碼串 0010110 該怎麼識別呢?第乙個 0 可以識別為 i1,也可以和第二個 0 組成的串 00 一起被識別為 i3, 還可以將前三位識別為 i6,這樣一來,這個編碼串就有多種譯法。因此,若要設計變長的編 碼,則這種編碼必須滿足這樣乙個條件:任意乙個編碼不能成為其他任意編碼的字首。把滿足這個條件的編碼叫做字首編碼

利用哈夫曼演算法,就可以設計出最優的字首編碼。首先,以每條指令的使用頻率為權值構造哈夫曼樹,據表 6-5 構造的哈夫曼樹如圖所示。

對於該哈夫曼樹,規定向左的分支標記為 0,向右的分支標記為 1,如下圖所示。這樣, 從根結點開始,沿線到達各頻度指令對應的葉結點,每個葉結點對應的編碼長度不等,但最 長不超過 n,所經過的分支**序列,就構成了相應頻度指令的哈夫曼編碼,如表 6-7 所示。

;/* 儲存哈夫曼編碼串的頭指標陣列 */

由於每個哈夫曼編碼是變長編碼,因此使用指標陣列存放每個編碼串的頭指標。

演算法描述】 求哈夫曼樹的哈夫曼編碼的演算法

void

crthuffmancode

(huffmantree ht, huffmancode hc,

int n)

/*從葉子結點到根,逆向求每個葉子結點對應的哈夫曼編碼*/

hc[i]=(

char*)

malloc

((n-start)

*sizeof

(char))

;/*為第 i 個編碼分配空間*/

strcpy

(hc[i]

,&cd[start]);

/*把編碼複製到 hc[i]中*/

}free

(cd)

;}

構造哈夫曼樹 哈夫曼編碼

1.權值越大的節點,距離根越近 2.樹中沒有度為1的節點,這類樹叫正則 嚴格 二叉樹,樹的總節點 2 雙分支結點 1 單分支結點 雙分支結點 3.樹的帶權路勁 wpl 所有葉子結點的帶權長度路勁之和 長度最短。嗶哩嗶哩王卓老師的口訣 構造森林全是根,選用兩小選新樹,刪除兩小添新人,重複23剩單根 1...

哈夫曼樹構造 哈夫曼編碼

一 哈夫曼樹 p189 1.定義 帶權路徑長度 wpl 最小的二叉樹稱為哈夫曼樹 wpl 樹中所有葉子節點的帶權路徑長度之和 帶權路徑長度 從樹根到任意節點的路徑長度與該節點上權值的乘積 2.構造 1 將這n個節點分別作為n課僅含乙個結點的二叉樹,構成森林f 2 構造乙個新節點,從f中選取兩棵根節點...

哈夫曼樹的構造與哈夫曼編碼

include include include define n 20 葉子結點最大值 define m 2 n 1 所有結點最大值 靜態三叉鍊錶實現哈夫曼樹 typedef struct huffmanhuf node,huf tree m 1 儲存哈夫曼編碼串的頭指標陣列 由於每個哈夫曼編碼是變...