1 .
需求分析
1.1問題描述
•問題描述:利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時間,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳資料預先編碼,在接收端將傳來的資料進行解碼(解碼)。對於雙工通道(即可以雙向傳輸資訊的通道),每端都需要乙個完整的編/解碼系統。試為這樣的資訊收發站設計乙個哈夫曼編譯碼系統。
1.2基本要求
(1) 輸入的形式和輸入值的範圍;
(2) 輸出的形式;
(3) 程式所能達到的功能。 1.
基本要求
(1)初始化(initialzation)。從資料檔案datafile.data中讀入字元及每個字元的權值,建立哈夫曼樹hufftree;
(2)編碼(encoding)。用已建好的哈夫曼樹,對檔案tobetran.data中的文字進行編碼形成報文,將報文寫在檔案code.txt中;
(3)解碼(decoding)。利用已建好的哈夫曼樹,對檔案codefile.data中的**進行解碼形成原文,結果存入檔案textfile.txt中;
(4)輸出(output)。輸出datafile.data中出現的字元以及各字元出現的頻度(或概率);輸出tobetran.data及其報文code.txt;輸出codefile.data及其原文textfile.txt;
2.
概要設計
說明本程式中用到的所有抽象資料型別的定義。主程式的流程以及各程式模組之間的層次(呼叫)關係。
(1)
資料結構
哈夫曼樹的節點
struct huff ;
哈夫曼編碼的儲存
struct huff *hufftree;
(2)
程式模組
選擇1到i-1中parent為0且權值最小的兩個下標
void select(struct huff *ht, int n, int&s1, int &s2)
構建哈夫曼樹:
void huffmancoding(struct huff *ht,int *w,intn)
對原文進行編碼:
void code(char *c)
根據報文找到原文:
void decoding(char *zifu)
3.
詳細設計
核心技術分析: 1
:構建哈夫曼樹及生成哈夫曼編碼:
根據每個字元權值不同,根據最優二叉樹的構建方法,遞迴生成哈夫曼樹,並且用陣列存放哈夫曼樹。
再從每一葉子節點向樹根遍歷,求得編碼
例如:如圖所示的四個節點v1,v2,v3,v4,他們的權值分別為7,11,4,5
7 11 4 5
第一步:選擇兩個權值最小的節點作為左右子孩子,建立乙個二叉樹,雙親權值為兩個自孩子之和,如圖
7 11 9
重複第一步:
11 16
27重複第一步: 16
則此時建立的是優有二叉樹,約定定左子樹邊編碼為1,右子樹編碼為0,則可以對次二叉樹進行編碼,如圖:
1 0
1 0
1 0
則各頂點的編碼為:
v1 01
v2 1
v3 001
v4 000
2:將原文編碼:
逐個從檔案讀入字元,根據已經建立好的哈夫曼樹,找到每一字元對應的編碼 3
:將報文解碼:
步驟一:
先讀入乙個字元,存入匹配字串
步驟二:
根據匹配串找所有的哈夫曼編碼,如果找到對應的編碼,則輸入該編碼所對應的字元,如果找不到,則讀入兩個字元存入匹配串,重複步驟二,找到為止。
步驟三:
把剩下的字元重複步驟一二
#include#include#includestruct huff
;int mm;/*記錄哈夫曼字碼的個數*/
struct huff *hufftree;
char **huffmancode;
void select(struct huff *ht, int n, int &s1, int &s2)//選擇函式,選出parent為零,且權值最小的兩個節點
for(i=1;i<=n;i++)
if((min2>ht[i].weight)&&(ht[i].parent==0)&&(i!=s1))
min2=ht[i].weight;
for(i=1;i<=n;i++)
if((min2==ht[i].weight)&&(ht[i].parent==0)&&(i!=s1))
}int pipei(char *c)/*在huffmancode尋找匹配的編碼*/
for(;i<=m;i++,p++)
for(i=1;i<=4;i++)
for(i=n+1;i<=m;i++)
char *cd;
cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
int start,c,f;
for(i=1;i<=n;++i)
free(cd);
}
Huffman編碼與解碼
近期學習資料結構碰到huffman編碼與解碼問題,自己動手寫了一些,注釋比較全,ok,下面直接貼 include include define telemtype char define wtype int define leafnumber 5 預設權重集合大小 define totalnumbe...
Huffman編碼 資料結構
include include include class data typedef class huffman huffmantree typedef char huffmancode 在陣列中選擇兩個小的權的資料 void select int tw,int n,int s1,int s2 te...
資料結構Huffman樹及編碼
一 實驗目的 構造乙個哈夫曼樹,並根據所構造的哈夫曼樹求其哈夫曼樹的編碼 二 基本思路 將每個英文本母依照出現頻率由小排到大,最小在左,組成乙個序列 每個字母都代表乙個終端節點 葉節點 比較每個字母的出現頻率,將最小的兩個字母頻率相加合成乙個新的節點,將兩個字母從序列中刪除,將生成的節點加入到字母佇...