版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、哈夫曼算法及其應(yīng)用一、問題描述給定n個權(quán)值作為n個葉子結(jié)點,構(gòu)造一棵二叉樹,若帶權(quán)路徑長度達(dá)到最小,稱這樣 的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹。哈夫曼編碼是一種根據(jù)哈夫曼樹對文件進(jìn)行編碼 的方式。哈夫曼編碼是可變字長編碼的一種。本次課程設(shè)計是對一個已建文本文件,統(tǒng)計該 文件中各字符頻率,對各字符進(jìn)行Huffman編碼,將該文件翻譯成Huffman編碼文件,再將 Huffman編碼文件翻譯成原文件。壓縮文件即讀文件,統(tǒng)計文件中的字符個數(shù),對文件進(jìn)行 哈夫曼編碼和譯碼,并將編碼譯碼后的字符存儲在文件中。二、基本要求程序要求實現(xiàn)以下功能:統(tǒng)計文本文件中各字符的出現(xiàn)次數(shù)(涉及讀文件,統(tǒng)計字符個數(shù));
2、對文件中的字符進(jìn)行哈夫曼編碼,并存儲入字符編碼文件;.根據(jù)字符編碼文件對文本文件內(nèi)容進(jìn)行編碼;.根據(jù)字符編碼文件和已編碼文件的內(nèi)容進(jìn)行譯碼;5.能夠輸出原文、編碼表、文本文件編碼、譯文。三、測試數(shù)據(jù)In its medical literature, the Food and Drug Administration states that hot water comfortable enough for washing hands is not hot enough to kill bacteria, but is more effective than cold water because
3、itremoves oils from the hand that can harbor bacteria.四、算法思想1、哈夫曼樹建立算法:1)根據(jù)給定的n個權(quán)值W1,W2, W3Wn構(gòu)成n棵二叉樹的集合T1,T2, Tn,其中Ti中只有一個權(quán)值為Wi的根結(jié)點,左右子樹均為空。2)在F中選取兩棵根結(jié)點的權(quán)值最小的樹作為左、右子樹一構(gòu)造一棵新的二叉樹,且 置新的二叉樹的根結(jié)點的權(quán)值為左、右子樹上根結(jié)點的權(quán)值之和。3)在F中刪除這兩棵中權(quán)值最小的樹,同時將新得到的二叉樹加入F中。4)重復(fù)2) 3)直到F中僅剩一棵樹為止,這棵樹就是哈夫曼樹。2、哈夫曼編碼算法:通過從哈夫曼樹根結(jié)點開始,對左子樹分
4、配代碼“ 1”,右子樹分配代碼“0”,一直到 達(dá)葉子結(jié)點為止,然后將從樹根沿每條路徑到達(dá)葉子結(jié)點的代碼排列起來,便得到了哈夫曼 編碼。3、對文件字符編碼算法:逐一讀取文件中字符,在哈夫曼編碼表查找對應(yīng)字符,讀取其編碼并寫入文件,如此循 環(huán)直至結(jié)束。4、哈夫曼譯碼算法:根據(jù)編碼用的哈夫曼樹,從根結(jié)點出發(fā),逐個讀入電文中的二進(jìn)制碼;若代碼為“1”, 則走左子樹的根結(jié)點,否則走向右子樹的根結(jié)點;一旦到達(dá)葉子結(jié)點,便譯出代碼所對應(yīng)的 字符。然后又重新從根結(jié)點開始繼續(xù)譯碼,直到二進(jìn)制電文結(jié)束。五、模塊劃分Void InitHT(HuffmanT T)初始化Huffman樹。Void SelectMin(
5、HuffmanT T, int n, int &p1, int &p2)找到權(quán)重最小的葉子。Void LoadHuffmanFile(HuffmanT T)加載文件。Void CreatHT(HuffmanT T)構(gòu)造Huffman樹。Void CharSetHuffmanEncoding(HuffmanT T, HuffmanCode H)根據(jù)Huffman樹求Huffman編碼表。Void EncodingHuffmanT(HuffmanT T, HuffmanCode H)對文件編碼。Void DecdingHuffmanT(HuffmanT T, HuffmanCode H)根據(jù)Huf
6、fman編碼、譯碼。Void PrintHuffmanT(HuffmanT T)打印Huffman權(quán)重表。Void PrintHuffmanH(HuffmanT T, HuffmanCode H)打印Huffman編碼表。Void MainMenue ()主菜單。提供相關(guān)的操作提示。Int main ()主函數(shù)。用個while循環(huán)和switch選擇結(jié)構(gòu)進(jìn)行進(jìn)行循環(huán)交互性操作。六、數(shù)據(jù)結(jié)構(gòu)/(ADT)1、哈夫曼樹的存儲結(jié)構(gòu):typedef struct char ch;/字符int weight;/字符權(quán)重int lchild;/左子int rchild;int parent; THNODE;2
7、、哈夫曼編碼表的存儲結(jié)構(gòu): typedef struct char ch;char bitsMAX_C + 1; CodeNode;七、源程序/Huffman.cpp源代碼如下:#include #include #include #define MAX_C 256#define MAX_N 512#define N 50/Huffman Tree 結(jié)構(gòu)*/ typedef struct char ch;int weight;int lchild;int rchild;int parent;THNODE;typedef THNODE HuffmanTMAX_N;/*Huffman 編碼表結(jié)構(gòu)*
8、/ typedef struct char ch;char bitsMAX_C + 1;CodeNode;/右子/雙親/存儲字符/字符編碼位串/定義最大字符數(shù)/定義最大Huffman節(jié)點個數(shù)/字符/字符權(quán)重左子/右子/雙親/存儲字符/字符編碼位串typedef CodeNode HuffmanCodeMAX_C;HuffmanCode H;/* 全局變量 */int n;/指示待編譯文件的字長char filename20;/*初始化Huffman樹*/void InitHT(HuffmanT T) int i;for (i = 0; i MAX_N; i+) Ti.ch = 0;Ti.wei
9、ght = 0;Ti.lchild = -1;Ti.rchild = -1;Ti.parent = -1;/*找到權(quán)重最小的葉子*/void SelectMin(HuffmanT T, int n, int &p1, int &p2) int i;int j;for (i = 0; i 0)p1 = i;break;for (j = i + 1; j 0)p2 = j;break;for (i = 0; i Ti.weight) & (Ti.parent = -1) & (p2 != i) & (Ti.weight 0)p1 = i;for (j = 0; j Tj.weight) & (Tj
10、.parent = -1) & (p1 != j) & (Tj.weight 0)p2 = j;/* 加載文件 */void LoadHuffmanFile(HuffmanT T) unsigned int i; int j = 0; char c;int aMAX_C;FILE *fp;printf(Input file name:);scanf(%s”, filename); if (fp = fopen(filename, rb) = NULL) printf(Cant open %sn, filename);exit( 0 );for (i = 0; i MAX_C; i+) ai =
11、 0;fseek(fp, 0, SEEK_SET); while ( 1 )/( !feof(fp) fread(&c, sizeof(unsigned char), 1, fp); if (feof(fp) break;a(unsigned int)c+;fclose(fp);/*統(tǒng)計輸入文件的字符及其權(quán)重并存放到樹T*/ for (i = 0; i MAX_C; i+) if (ai != 0)Tj.ch = (unsigned char)i;Tj+.weight = (unsigned int)ai; n = j;/*構(gòu)造 huffam 樹,T2 * n - 1為其根*/ void Cr
12、eatHT(HuffmanT T) int i,p1,p2;LoadHuffmanFile(T);/加載被編碼文件for (i = n; i 2 * n - 1; i+) SelectMin(T, i - 1, p1, p2);Tp1.parent = Tp2.parent = i;Ti.lchild = p1;Ti.rchild = p2;Ti.weight = Tp1.weight + Tp2 .weight;/*根據(jù) Huffman T 求 Huffman 編碼表 H*/ void CharSetHuffmanEncoding(HuffmanT T, HuffmanCode H) int
13、 c;int p;int i;int start;char cdN;/指示T中孩子的位置/指示T中雙親的位置/指示編碼在cd中的位置for (i = 0; i = 0)cdstart = (Tp.lchildc = p;strcpy(Hi.bits, &cdstart);/依次求葉子的編碼/讀入葉子Ti對應(yīng)的字符/編碼起始位置的初值/從葉子Ti開始回溯/直到回溯到Tc是樹根位置 =c) ? 0 : 1;/復(fù)制臨時編碼到編碼表中/臨時存放編碼/*對文件編碼,將結(jié)果保存到codefile.txt中*/void EncodingHuffmanT(HuffmanT T, HuffmanCode H)
14、char c;FILE *in,*fp;int j,l;char encodefile20,tempMAX_C;if (in = fopen(filename, rb) = NULL) printf(Read %s fail!n”, encodefile); exit(1);CharSetHuffmanEncoding(T, H);printf(Input encode file name:);gets( encodefile );if (fp = fopen(encodefile, wb) = NULL) printf(Write %s fail!n, encodefile); exit(1
15、);fread(&c, sizeof(unsigned char), 1, in);fwrite(&c, sizeof(unsigned char), 1, fp);fseek(in, 0, SEEK_SET);fseek(fp, 0, SEEK_SET);while ( 1 )/( !feof( in ) fread(&c, sizeof(unsigned char), 1, in); if (feof(in) break;for (j = 0; j n; j+)if (c = Hj.ch) l = 0;while (Hj.bitsl != 0) templ = Hj.bitsl;l+;in
16、t m = 0;while ( l)fwrite(&tempm+, sizeof(unsigned char), 1, fp);fclose(fp);printf(Encoding file has saved into %s!n, encodefile);/*根據(jù)Huffman編碼、譯碼*/void DecodingHuffmanT(HuffmanT T, HuffmanCode H) int i;/指示 Huffman tree 葉子個數(shù)FILE *fp,*fp1;char ch,ch120,ch220;printf(Input encode file name:);scanf(%s”,
17、chi);printf(Input decode file name:);scanf(%s”, ch2);fp = fopen(ch1, rb);fpl = fopen(ch2, wb);/根據(jù)Huffman樹對Huffman編碼 譯碼i = 2 * n - 2;fseek(fp, 0L, SEEK_SET);fseek(fp1, 0L, SEEK_SET);while (!feof(fp) fread(&ch, sizeof(unsigned char), 1, fp);if (ch = 0)/若編碼為。,則找此結(jié)點的左子樹;i = Ti.lchild;if (ch = 1)/若編碼為1,則
18、找此結(jié)點的右子樹;i = Ti.rchild;if (i n) fwrite(&Ti.ch, sizeof(unsigned char), 1, fp1);i = 2 * n - 2;fclose(fp);fclose(fp1);printf(Decoding accomplished!nThe result has save input %s.n”,ch2); getchar();/*打印Huffman權(quán)重表*/void PrintHuffmanT(HuffmanT T) int i;FILE *fp;if (fp = fopen(treeprint.txt”, wb) = NULL) pr
19、intf(Open treeprint.txt fail!n);exit(1);printf(nLeaf&weight of the Huffman tree is below:n);for (i = 0; i 0) printf(n);if (Ti.weight 0) fprintf(fp, %c:%d , Ti.ch, Ti.weight);printf(%c: %d , Ti.ch, Ti.weight);fclose(fp);printf(nLeaf&weight of the Huffman tree saved in treeprint.txtnn);/*打印Huffman編碼表*
20、/void PrintHuffmanH(HuffmanT T, HuffmanCode H) int i;FILE *fp;CharSetHuffmanEncoding(T, H);if (fp = fopen(codeprint.txt”, wb) = NULL) printf(Open codeprint.txt fail!n);exit(1);for (i = 0; i 0) printf(n);printf(%c: %sn, Ti.ch, Hi.bits);fprintf(fp, %c:%s , Ti.ch, Hi.bits);fclose(fp);printf(nHuffman tr
21、ee code saved in codeprint.txt!nn);/*主菜單*/void MainMenue() fflush( stdin );printf(n* Main Menue *n);printf(*n);printf(*1. Load to be dealt file.*n);printf(*2. Show Huffman code list.*n)printf(*3. Show Huffman weight list.*n)printf(*4. Encoding Huffman file.*n)printf(*5. Decoding Huffman file.*n)prin
22、tf(*6. Exit.*n)printf(*n)t-x -i s 1- t s iprintfi*n/*主函數(shù)開始*/int main()int flag = 1; char ch10; HuffmanT T;HuffmanCode H; InitHT(T);while ( flag ) /定義Huffman樹/定義Huffman編碼表/初始化Huffman樹MainMenue();printf(Please input your choice(16):);gets( ch );switch (ch0)case 1CreatHT(T);break;case 2PrintHuffmanH(T,
23、 H);break;case 3PrintHuffmanT(T);break;case 4EncodingHuffmanT(T, H);break;case 5DecodingHuffmanT(T, H);break;case 6exit(1);default:printf(Input error!n);break;return 0;八、測試情況程序的測試結(jié)果如下:| decodefile.txt -記事本文件(F)蠲(E)瑚(。)鬲(V)落- 一In its medical literature, the Food and Drug Adinini strati on states that
24、 hot water coinfortable enoughfor washing hands is not hot enough to kill bacteria, but is more effective than cold water because itremoves oils from the hand that can harbor bacteria.:1011010:1011011:110,:1011101.:101111000: 10111101D: 10111110F: 10111111I: 11100100a: 1001b: 00010c: 10101d: 01111e:
25、 1111f: 111000g: 101100h: 0110i: 0100M 1H001011: 10100m: 00011n: 0000o: 1000r: 0101S: 11101t: 001U: 01110L 1011100W: 1110011Huffman tree code saued in codeprint.txt?建立哈夫曼樹、打印編碼表正確。Leaf8tweight of theHuffman tree is below::2: 40r -2.:1A: 1 D: 1F:1 I:1 a:21b: 6 c: 8d:7 e:21 f:54 h: 13i15k: 11: 7n: 6 n
26、: 1218r: 15s : 11t: 26 u: 6u2w: 3Leaf&weightoftheHuffmantree saved in treeprint.txt打印權(quán)重表正確。Matin Menue *otxxoo(oo(oooooooooo TOC o 1-5 h z 1. Load to be dealt f ile.*J*2.Show Huffmancode list.*J*3.Show Huffmanweight list.*4. Encoding Huffman file.*J*5.Decoding Huffman file.*k*6.Exit.*mt-Please input
27、 90ur choice”: 4Input encode file name: encodefile.txtEncoding file has saved into encodefile.txtf* Main Menue TOC o 1-5 h z J*1.Load to be dealt f ile.*J*2.Show Huffman code list.*X3.Show Huffman weight list.*4. Encoding Huffman file.*J*5.Decoding Huffman file.*k*6.Exit.*M-M*Please input pour choic
28、e: 5 Input encode file name: encodefile.txt Input decode file name: decodefile.txt Decoding accomplished?The result has saue input decodefile.txt.二encodefile.txt -記事本莫件(F) 好(E)悟式(吃查看(V)竟氤而111001000000110010000111101110000111111011110100101011001101001101010001 000011111010110010010111001011111101110
29、111000101101111110101111111000100001111110100100000111111010111110010101110101100110101111010111100011010000000100111010010101100100101001000000011011101001100100111111110111000101101001001110011010000011101110011100100111110101110101011000000111110001000010100110010001010100111111011110000100001110
30、101100011010110111011010111000100001011101110011100111101011001000000101100110011010010000011111110111001001110111000001000001110011010000011101111000010000111010110001101100011000110111001010100101001010011000010100110101001111101010100100110111011100001001110001110010011101110000111000010111111101
31、111111000111000111110101001010010111001111110001011010010000110101011000101000111111011100111001001111101011100001011111010110010111011101111111001000011011011101101001011111000111000101110011111110111010000100101001110111011100001011000000111100010110111111001101001000001111110001011010010011101010110010000110011010010101000101000010111000010100110101001111101010100100110111100哈夫曼編碼正確。| decodefile.txt -記事本I 口 回In its medical literature, the Food and Drug Administra
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年心理測試考試題庫及答案一套
- 2026年山西鐵道職業(yè)技術(shù)學(xué)院單招綜合素質(zhì)考試題庫附答案
- 2026年深圳地鐵心理考試題庫及參考答案一套
- 2026年心理放松考試題庫及答案一套
- 2026年河北省保定市單招職業(yè)適應(yīng)性測試模擬測試卷附答案
- 2026年廣東省深圳市單招職業(yè)傾向性測試模擬測試卷附答案
- 2026廣東深圳大學(xué)生命與海洋科學(xué)學(xué)院蔣浩宇教授課題組博士后招聘筆試備考試題及答案解析
- 2026福建省三鋼(集團(tuán))有限責(zé)任公司社會招聘筆試參考題庫及答案解析
- 2026海南省航天技術(shù)創(chuàng)新中心招聘5人筆試備考題庫及答案解析
- 2025年福建莆田市莆陽醫(yī)院內(nèi)科醫(yī)生招聘5人備考題庫附答案
- 土石方土方運輸方案設(shè)計
- 肛腸科進(jìn)修匯報
- 電網(wǎng)技術(shù)改造及檢修工程定額和費用計算規(guī)定2020 年版答疑匯編2022
- 玉米地膜覆蓋栽培技術(shù)
- 寫作篇 Chapter One Paragragh Writing課件完整版
- 郵輪郵輪產(chǎn)業(yè)與郵輪經(jīng)濟(jì)概述
- WB/T 1019-2002菱鎂制品用輕燒氧化鎂
- 完整word版毛澤東思想和中國特色社會主義理論體系概論知識點歸納
- GB/T 18926-2008包裝容器木構(gòu)件
- DB11T 594.1-2017 地下管線非開挖鋪設(shè)工程施工及驗收技術(shù)規(guī)程第1部分:水平定向鉆施工
- GB∕T 26408-2020 混凝土攪拌運輸車
評論
0/150
提交評論