哈夫曼演算法編碼原理與應用

2021-04-30 00:33:04 字數 2647 閱讀 6794

概述

2)從左到右把上述頻率按從小到大的順序排列。

3)每一次選出最小的兩個值,作為二叉樹的兩個葉子節點,將和作為它們的根節點,這兩個葉子節點不再參與比較,新的根節點參與比較。

4)重複(3),直到最後得到和為1的根節點。

將形成的二叉樹的左節點標0,右節點標1。把從最上面的根節點到最下面的葉子節點路徑中遇到的0,1序列串起來,得到各個符號的編碼。

可以看到,符號只能出現在樹葉上,任何乙個字元的路徑都不會是另一字元路徑的字首路徑,這樣,字首編碼也就構造成功了。

這樣一棵二叉樹在資料結構課程中稱之為huffman樹,常用於最佳判定,它是最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為:wpl= (w1*l1+w2*l2+w3*l3+…+wn*ln),n個權值wi(i=1,2,…n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為 li(i=1,2,…n)。huffman樹得出的wpl值最小。

2 2在對一幅大小為100,672bytes 8位bmp影象檔案進行huffman編碼過程中,作者按照以下步驟實現了的壓縮和解壓縮演算法。

1)掃瞄位**件的全部資料(對應用於調色盤的編碼),完成資料頻度的統計。

2)依據資料出現的頻度建立哈夫曼樹。

3)將哈夫曼樹的資訊寫入輸出檔案(壓縮後檔案),以備解壓縮時使用。

4)進行第二遍掃瞄,將原檔案所有編碼資料轉化為哈夫曼編碼,儲存到輸出檔案。解壓縮則為逆過程,以下是編碼和解碼的實現演算法。

a)定義資料結構node如下:

struct node

;//父節點為-1的節點是樹根

bmp huff code(bmp tree[node] parent,node);//若不為-1則遞迴

if(child≠-1);//若不為葉節點

c)解碼時從樹根開始,遇1取右節點,遇0取左節點,直到找到節點號小於256的節點(葉節點)。

huhnun解碼過程如下:

int expand huffman(void)

//取當前節點的左節點號;

else if(head flag=1)若為「1」

//取當前節點的右節點號;

}while(node>=256);//節點號大於256繼續迴圈

}expanddata-buffer[counter++]=node;//輸出解碼得到乙個位元組

壓縮後的檔案大小為48,431bytes,壓縮比為48 1%,解壓縮後的資料讀出的影象正常。

演算法原理:

ht首先被提出來,是為了解決這樣的問題:

對於n種資料(比如5種資料:a、b、c、d、e),在出現的頻率已知的情況下(比如分別出現了3、5、2、6、4次),如何用不等長的01串來分別表示它們,使01串的總長度最短。

比如原始串:abadbcbdabedbdedcede     對於這個問題,首先得到:任何乙個01串都不能是其他01串的字首

。也就是說,如果用「10」來表示a,那麼其他01串就不能以「10」開頭。

建立01串的步驟如下:     首先找到出現最少的兩個資料(a、c),分別以它們為左右子樹,

建立乙個二叉樹。並將它們出現次數之和作為根節點:

1) 5     5b    6d    4e

/  /

3a   2c

然後從剩下的4個數舉重找到兩個最小的,做同上的操作,知道只

剩乙個資料為止:

2) 5            9          6d

/ /          /   /

3a 2c   5b 4e

3)

11            9

/   /           /   /

5    6d   5b 4e

/ /

3a 2c

4)

20 /         /

11          9

/   /            /   /

5    6d    5b   4e

/ /

3a 2c

最後從根節點開始,每個左子樹填0,右子樹填1:

root

/        /

0           1

/ /           / /

0   1d   0b 1e

/    /

0a 1c

這樣每個資料對應的01串就是從根節點到資料所在的葉子節點的路

徑: a: 000

b: 10

c: 001

d: 01

e: 11

這樣原始串abadbcbdabedbdedcede就成了:

000100000110001100100010110110011101001110111

壓縮:

把256個ascii碼看作256種資料,分析它們出現的次數,建立ht,

得到256個01串。用這256個01串去替換原來的字元並按照二進位制處理,

就可以得到壓縮後的檔案了。

文章出處:http://www.diybl.com/course/3_program/c++/cppjs/2007114/83951_5.html

哈夫曼演算法編碼原理與應用

演算法原理 ht首先被提出來,是為了解決這樣的問題 對於n 種資料 比如 5種資料 a b c d e 在出現的頻率已 知的情況下 比如分別出現了3 5 2 6 4次 如何用不等長的 01串來分別表示它們,使 01串的總長度最短。比如原始串 abadbcbdabedbdedcede 對於這個問題,首...

哈夫曼演算法編碼原理與應用

演算法原理 ht首先被提出來,是為了解決這樣的問題 對於n種資料 比如5種資料 a b c d e 在出現的頻率已知的情況下 比如分別出現了3 5 2 6 4次 如何用不等長的01串來分別表示它們,使01串的總長度最短。比如原始串 abadbcbdabedbdedcede 對於這個問題,首先得到 任...

哈夫曼編碼原理

哈弗曼編碼幾乎是所有壓縮演算法的基礎,其實這個演算法並不複雜,簡單的理解就是,如何用更短的bit來編碼資料。我們知道普通的編碼都是定長的,比如常用的ascii編碼,每個字元都是8個bit 字元編碼 a00101001 b00101010 c00101011 這樣,計算機就能很方便的把由0和1組成的資...