資料結構Huffman編碼解碼

2021-07-24 10:53:25 字數 2756 閱讀 1516

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樹及編碼

一 實驗目的 構造乙個哈夫曼樹,並根據所構造的哈夫曼樹求其哈夫曼樹的編碼 二 基本思路 將每個英文本母依照出現頻率由小排到大,最小在左,組成乙個序列 每個字母都代表乙個終端節點 葉節點 比較每個字母的出現頻率,將最小的兩個字母頻率相加合成乙個新的節點,將兩個字母從序列中刪除,將生成的節點加入到字母佇...