哈夫曼編碼問題

2021-09-29 11:52:32 字數 1810 閱讀 2231

1、介紹

在計算機資料處理中,哈夫曼編碼使用變長編碼表對源符號(如檔案中的乙個字母)進行編碼,其中變長編碼表是通過一種評估**符號出現機率的方法得到的,出現機率高的字母使用較短的編碼,反之出現機率低的則使用較長的編碼,這便使編碼之後的字串的平均長度、期望值降低,從而達到無失真壓縮資料的目的。

例如,在英文中,e的出現機率最高,而z的出現概率則最低。當利用哈夫曼編碼對一篇英文進行壓縮時,e極有可能用乙個位元來表示,而z則可能花去25個位元(不是26)。用普通的表示方法時,每個英文本母均占用乙個位元組,即8個位元。二者相比,e使用了一般編碼的1/8的長度,z則使用了3倍多。倘若我們能實現對於英文中各個字母出現概率的較準確的估算,就可以大幅度提高無失真壓縮的比例。

哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的路徑長度是從樹根到每一結點的路徑長度之和,記為wpl=(w1l1+w2l2+w3l3+…+wnln),n個權值wi(i=1,2,…n)構成一棵有n個葉結點的二叉樹,相應的葉結點的路徑長度為li(i=1,2,…n)。可以證明哈夫曼樹的wpl是最小的。

本文求解的是,字母表,它們在乙個長串**現的頻率分別是0.31, 0.2, 0.09, 0.4。試給出四個字母的huffman編碼。

2、**

#include

#include

#define n 4

//陣列長度

char code[n]

;//儲存哈夫曼編碼

typedef

struct node treenode;

typedef

struct

weight;

weight num=,,

,,

//查詢權值小的下標

void

findletter

(int

*pint,

int*pint1, treenode *

*pnode,

int l)

if(data > pnode[i]

->data)

} data = pnode[

*pint]

->data;

//從陣列第乙個開始比較

for(i =

0; i < l;

++i)

if(data >= pnode[i]

->data)

}*pint = mark;

*pint1 = mark1;

}//構建哈夫曼樹

treenode *

createhuffman

(int l)

for(i =

0; i < l -1;

++i)

free

(mid)

;return p;

}//構造哈夫曼編碼

void

prehufforder

(treenode *p,

int i,

char c)

prehufforder

(p->lchild, i +1,

'0')

;//左子樹編碼0

prehufforder

(p->rchild, i +1,

'1')

;//右子樹編碼1

if(p->lchild==

null

&&p->rchild==

null)}

}//主函式

intmain()

哈夫曼編碼問題

輸入乙個整數n,n 100,下面n行分別為n個字元及其出現頻率 輸出所有字元的頻率與其編碼長度的乘積之和 輸入 5 a 35 b 10 c 20 d 20 15 輸出 225輸入 3 x 20 y 50 z 5輸出 100整體思路 class node node 注意點 void printf in...

哈夫曼編碼問題

給定乙個數字n,代表有n種不同的字元,已知每種字元的出現次數,現在要求你設計一種編碼,使得任意乙個編碼都不是另外乙個編碼的字首,並且使得這些字元經過編碼壓縮之後的總長度最小 乙個數字n 代表有多少種不同的字元 0 n 1000 n個數字 每個數字代表一種字元的出現次數 乙個數字,代表總的編碼長度 5...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....