c 實驗8 哈夫曼編碼 解碼器

2022-09-13 19:15:14 字數 3732 閱讀 9016

此次實驗的注釋解析多加不少---若對小夥伴們有幫助 希望各位麻煩點個關注 多謝

(1)由給定的n個權值構造n棵只有根結點的二叉樹,從而得到乙個二叉樹森林f=。

(2)在二叉樹森林f中選取根結點的權值最小和次小的兩棵二叉樹作為新的二叉樹的左右子樹構造新的二叉樹,新的二叉樹的根結點權值為左右子樹根結點權值之和。

(3)在二叉樹森林f中刪除作為新二叉樹左右子樹的兩棵二叉樹,將新二叉樹加入到二叉樹森林f中。

(4)重複步驟(2)和(3),當二叉樹森林f中只剩下一棵二叉樹時,這棵二叉樹就是所構造的哈夫曼樹。

[問題描述](設計性實驗)

哈夫曼樹很易求出給定字符集及其概率(或頻度)分布的最優字首碼。哈夫曼編碼正是一種應用廣泛且非常有效的資料壓縮技術。該技術一般可將資料檔案壓縮掉20%至90%,其壓縮效率取決於被壓縮檔案的特徵。

利用哈夫曼編碼進行通訊可以大大提高通道利用率,縮短資訊傳輸時,降低傳輸成本。但是,這要求在傳送端通過乙個編碼系統對待傳送電文須預先編碼,在接收須將傳送來的資料進行解碼。請自行設計實現乙個具有初始化、編碼、解碼、輸入/輸出等功能的哈夫曼碼的編碼/解碼系統。並實現以下報文的編碼和解碼:「this program is my f**orite」。

[測試資料]

某通訊的電文字符集為26個英文本母及空格字元,其出現頻度如下表所示:

先對輸入的字串進行操作

再利用haffman編碼進行儲存轉譯

實現節省傳輸成本

順序儲存

[要求]

1、利用類模板來實現。

2、類中各成員函式要求給出自行設計的演算法步驟描述及主要設計思想。

3、給出類中各成員函式演算法設計實現。

答:haffman(int weight, int n);                   //建構函式  時間複雜度o(n)

code* haffmancode(int n,code* haffcode,char* c);//將haffman進行編碼  時間複雜度o(n^2)

void encoding(int n,code* haffcode);            //輸出權值與編碼  時間複雜度o(n)

void decoding(int n,code* haffcode);            //輸出譯文  時間複雜度o(n)

結構體構造

haffnode-結點結構、code-編碼的資料元素結構

struct haffnode                      //

哈夫曼樹的結點結構

;struct code    //

存放哈夫曼編碼的資料元素結構

;

haffman類構造

#include using

namespace

std;

class

haffman

;haffman::haffman(

int weight, int

n)//

建立葉結點個數為n權值為weight的哈夫曼樹hafftree

for(int i = 0;i < n-1;i++)

else

if(hn[j].weight < m2 && hn[j].flag == 0

)

}//將找出的兩棵權值最小的子樹合併為一棵子樹

hn[x1].parent = n+i;

hn[x2].parent = n+i;

hn[x1].flag = 1

; hn[x2].flag = 1

; hn[n+i].weight =hn[x1].weight+hn[x2].weight;

hn[n+i].leftchild =x1;

hn[n+i].rightchild =x2;

}}//

哈夫曼編碼演算法如下:

code* haffman::haffmancode(int n,code* haffcode,char*c)

//由n個結點的哈夫曼樹hafftree構造哈夫曼編碼haffcode

//儲存葉結點的編碼和不等長編碼的起始位

for(int j = code->start+1; j < n; j++)

haffcode[i].bit[j] = code->bit[j];

haffcode[i].start = code->start;

haffcode[i].weight = code->weight; //

儲存編碼對應的權值

haffcode[i].data=c[i]; //

儲存原始資料

}

return

haffcode;

}void haffman::encoding(int n,code*haffcode)

}void haffman::decoding(int n,code*haffcode)

主函式

#include #include 

const

int maxvalue = 10000; //

初始設定的權值最大值

const

int maxbit = 4; //

初始設定的最大編碼位數

const

int maxn = 30; //

初始設定的最大結點個數

#include"

haffman.h

"using

namespace

std;

intmain()

;

//a-按順序存放各個字母

char a[27]=;

char b[30]; //

存放輸入字串

int c[30]; //

存放對應b陣列的權值

cout<

請輸入需要編碼英文的字串:";

cin.getline(b,

30); //

將輸入的字串儲存在b陣列中

//將c陣列權值與b陣列字串進行對應

for(n=0;b[n]!='

\0';n++)}}

if(n >maxn)

//生成haffcode陣列用作儲存 編碼後的資料

code* haffcode=new

code[n];

haffman hm(c, n);

//呼叫生成haffman樹

code* co=hm.haffmancode(n,haffcode,b);//

得到編碼後陣列co

cout<

編碼後:

"<

hm.encoding(n,co);

//對co進行遍歷輸出

cout<

---------------------------------------

"<

cout

<

解碼為:

"<

hm.decoding(n,co);

//對編碼陣列操作得到解碼

return0;

}

哈夫曼編碼解碼器

總結一下這次的課程設計,遇到的問題是如何解決的。功能 將權值資料存放在資料檔案data.txt中。鍵盤輸入字符集大小n n個字元和n個權值,建立哈夫曼樹。利用建好的哈夫曼樹生成哈夫曼編碼。使用data.txt中的權值資料生成的哈夫曼編碼,將檔案text.txt中的字串編碼儲存到huffmancode...

C 實現哈夫曼編碼 解碼器(資料結構)

設計乙個哈夫曼編碼 解碼系統。對乙個ascii編碼的文字檔案中的字元進行哈夫曼編碼,生成編碼檔案 反過來,可將編碼檔案解碼還原為乙個文字檔案。1 從檔案中讀入任意一篇英文短文 檔案為ascii編碼,擴充套件名為txt 2 統計並輸出不同字元在文章 現的頻率 空格 換行 標點等也按字元處理 3 根據字...

哈夫曼樹編碼解碼器(你們懂的)

希望點讚一下,哈哈哈哈哈 define maxsize 100 哈夫曼編碼的最大位數 typedef struct hufmtree typedef struct codetype void huffman hufmtree tree,int n,int m 建立哈夫曼樹 void huffmanc...