版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、網(wǎng)絡(luò)092李雨山200900824225實(shí)驗(yàn)四哈夫曼樹及其的應(yīng)用一、實(shí)驗(yàn)?zāi)康?. 在二叉樹基本操作的基礎(chǔ)上,掌握對(duì)二叉樹的一些其它操作的 具體實(shí)現(xiàn)方法。2. 掌握構(gòu)造哈夫曼樹以及哈夫曼編碼的方法。3. 熟練掌握哈夫曼樹(最優(yōu)二叉樹)特征及其應(yīng)用二、實(shí)驗(yàn)內(nèi)容題目一、哈夫曼樹和哈夫曼編碼:從終端輸入若干個(gè)字符,統(tǒng)計(jì)(或指定)字符出現(xiàn)的頻率,將 字符出現(xiàn)的頻率作為結(jié)點(diǎn)的權(quán)值,建立哈夫曼樹,然后對(duì)各字符進(jìn) 行哈夫曼編碼。最后打印哈夫曼樹和對(duì)應(yīng)的哈夫曼編碼。設(shè)計(jì)要求: 哈夫曼殊和哈夫曼編碼的存儲(chǔ)表示參考教材事例 在程序中構(gòu)造四個(gè)子程序?yàn)?int freqchar(char *st);/*統(tǒng)計(jì)字符出現(xiàn)的頻
2、率*/ void CreateHuffmanTree(HuffmanTree &,int*,int); /生成哈夫曼樹 void HuffmanCoding(HuffmanTree,HuffmanCode &,int ); / 對(duì)哈夫曼樹進(jìn)行編碼 void PrintHuffmanCode(HuffmanCode,int*,int,char*);/顯示哈夫曼編碼 void Select(HuffmanTree,int,int&,int&); /在數(shù)組中尋找權(quán)值最小的兩個(gè)結(jié)點(diǎn)三、實(shí)驗(yàn)步驟、數(shù)據(jù)結(jié)構(gòu)與核心算法的設(shè)計(jì)描述1.重點(diǎn):統(tǒng)計(jì)字符出現(xiàn)的頻率并作為權(quán)值int f
3、reqchar(char *st)/*統(tǒng)計(jì)字符出現(xiàn)的頻率 */i nt n=0;/統(tǒng)計(jì)字符的種類memset (num ,0,sizeof( nu m);f or(int i=0;i<M;i+)int t=sti-'a:nu mt+;f or(i nt j=0;j<27;j+)if(n umj!=0)n+;return n;2.將構(gòu)造一棵哈夫曼樹HTvoid CreateHuffma nTree(Huffma nTree &H T,i nt *w,i nt n)/w存放n個(gè)結(jié)點(diǎn)的權(quán)值,將構(gòu)造一棵哈夫曼樹HTi nt i,m;i nt s1,s2;Huffma nTr
4、ee p;i f(n<=1) return;m=2* n-1; n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹,有2* n-1個(gè)結(jié)點(diǎn)HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);/ 開辟 2*n 各結(jié)點(diǎn)空間f or(p=HT+1,i=1;i<=n;+i,+p,+w) / 進(jìn)行初始化p->weight=*w;p->pare nt=0;p->lchild=0;p->rchild=0;f or(;i<=m;+i,+p)p->weight=0;p->pare nt=0;p->lchild=0;p->rchild=0;f
5、or(i=n+1;i<=m;+i) /建哈夫曼樹Select(HT,i-1,s1,s2);/從HT1.i-1 中選擇pare nt為0且weight最小的兩個(gè)結(jié)點(diǎn),其 序號(hào)分別為s1和s2HTs1.parent=i;HTs2.parent=i; / 修改 s1 和 s2 結(jié)點(diǎn)的父指針pare ntHTichild=s1; HTi.rchild=s2; /修改i結(jié)點(diǎn)的左右孩子指針HTi.weight=HTs1.weight+HTs2.weight; /修改權(quán)值3. 哈夫曼編碼void Huffma nCodi ng(Huffma nTree HT,Huffma nCode & HC
6、,i nt n)/將有n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹HT進(jìn)行編碼,所編的碼存放在 HC中/方法是從葉子到根逆向求每個(gè)葉子結(jié)點(diǎn)的哈夫曼編碼i nt i,c,f,start;char *cd;HC=(HuffmanCode)malloc(n+1)*sizeof(char*);/ 分配 n 個(gè)編碼的頭指針向量cd=(char *)malloc( n*sizeof(char); /開辟一個(gè)求編碼的工作空間cd n-1='0: /編碼結(jié)束符f or(i=1;i<=n;+i) /逐個(gè)地求哈夫曼編碼/從葉子到start =n-1; /編碼結(jié)束位置for(c=i,f=HTi.pare nt;f!=O;c
7、=f,f=HTf.pare nt)根逆向求編碼if(HTf.lchild=c)cd-start='0' /若是左孩子編為'0'elsecd-start='1' /若是右孩子編為'1'HCi=(char *)malloc(n-start)*sizeof(char);/ 為第 i 個(gè)編碼分配空間strcpy(HCi,&cdstart); /將編碼從 cd 復(fù)制到 HC中 f ree(cd); / 釋放工作空間 4. 顯示有n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹的編碼表void Prin tHuffma nCode(Huffma nCode H
8、C,i nt *w,i nt n,char *c1)/顯示有n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹的編碼表i nt i;printf("HuffmanCode is :n");cout<<"字符"<<"-"<<"權(quán)值"<<"-"<<"哈弗曼編碼"<<endl; f or(i=1;i<=n ;i+)cout<<c1i-1<<"-"<<wi-1<<&q
9、uot;-"<<HCi<<e ndl;5. 找最小權(quán)值的兩個(gè)結(jié)點(diǎn)void Select(HuffmanTree HT,int t,int&s1,int&s2)/在HT1.t 中選擇pare nt不為0且權(quán)值最小的兩個(gè)結(jié)點(diǎn),其序號(hào)分 別為si和s2i nt i,m,n;m=n=10000;f or(i=1;i<=t;i+)if(HTi.pare nt=0&&( HTi.weight<m|HTi.weight <n)if(m<n)n=HTi.weight;s2=i;elsem=HTi.weight;s1=i;
10、i f(s1>s2) /s1 放較小的序號(hào)i=s1;s1=s2;s2=i;、函數(shù)調(diào)用及主函數(shù)設(shè)計(jì)void mai n()HUffmanTree HT; /哈夫曼樹 HTHUffma nCode HC; /哈夫曼編碼表 HCi nt n; /n是哈夫曼樹葉子結(jié)點(diǎn)數(shù)(字符種類的個(gè)數(shù))i nt *w; /w存放葉子結(jié)點(diǎn)權(quán)值char *c1;/c1存放字符串中字符的種類char aM;/用于儲(chǔ)存輸入的字符串cout<<"請(qǐng)輸入字符串:"while(c in> >a)n=freqchar(a);/得到字符種類的個(gè)數(shù)w=(i nt*)malloc( n*s
11、izeof(i nt); /開辟空間存放權(quán)值c1=(char*)malloc( n*sizeof(char); /開辟空間存放權(quán)值int j;for(i nt i=0;i <n ;i+)for(j=i;j<27;j+)if(n umj!=0)wi=nu mj;得到權(quán)值c1i=j+'a'得到字符種類break;/字符與權(quán)值相對(duì)應(yīng)CreateHuffma nTree(HT,w ,n); /生成哈夫曼樹Huffma nCodi ng(HT,HC, n); /進(jìn)行哈夫曼編碼Prin tHuffma nCode(HC,w, n,c1); /顯示哈夫曼編碼printf(”請(qǐng)輸入
12、字符串:");、程序調(diào)試及運(yùn)行結(jié)果分析輸入:abbcccdddd結(jié)果、實(shí)驗(yàn)總結(jié)通過這次實(shí)驗(yàn),我對(duì)二叉樹和哈希曼 樹有了更好的 認(rèn)識(shí)。在實(shí)驗(yàn)過 程中,我掌 握了哈希曼 樹的構(gòu)造方法,哈希曼編碼的方法,學(xué)會(huì)了如何將理論知識(shí)傳換成實(shí)際 應(yīng)用。同時(shí),在解決程序中遇到的一些 問題的同時(shí),我也對(duì)調(diào)試技巧有了更好的掌 握,分析問題的能力也略有提高。在實(shí)驗(yàn)中,我遇到了許多難點(diǎn),比如:統(tǒng)計(jì)字符的權(quán)值,就需要我們有扎實(shí)的 基礎(chǔ),需要有靈活的頭腦,只有不斷的練習(xí),不斷的訓(xùn)練,我們才能處理各種問題。在以后的學(xué)習(xí)中,我要不斷的努力,多聯(lián)系,多思考,我相信我能有所進(jìn)步的。四、主要算法流程圖及程序清單1、程序清單
13、#in clude <stdio.h>#in elude <stdlib.h>#in elude <stri ng.h>#i nclude <iostream.h>#define M 1000typedef structint weight; /結(jié)點(diǎn)權(quán)值in t pare nt,lchild,rchild; /結(jié)點(diǎn)的父指針,左右孩子指針HTNode,*Huffma nTree; /動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼樹typedef char *Huffma nCode; II動(dòng)態(tài)分配數(shù)組存儲(chǔ)哈夫曼編碼表int num27;統(tǒng)計(jì)字符出現(xiàn)的次數(shù)并作為權(quán)值int
14、freqchar(char *st);I*統(tǒng)計(jì)字符出現(xiàn)的頻率 */void CreateHuffma nTree(Huffma nTree & ,i nt*,i nt ); II生成哈夫曼樹void Huffma nCodi ng(Huffma nTree,Huffma nCode &int ); II對(duì)哈夫曼樹進(jìn)行編碼void Prin tHuffma nCode(Huffma nCode,i nt*,i nt,char*); II顯示哈夫曼編碼void Select(Huffma nTree,i nt,i nt&,int&); /在數(shù)組中尋找權(quán)值最小的兩個(gè)結(jié)
15、點(diǎn)void mai n()HuffmanTree HT; II哈夫曼樹 HTHuffma nCode HC; II哈夫曼編碼表 HCint n; IIn是哈夫曼樹葉子結(jié)點(diǎn)數(shù)(字符種類的個(gè)數(shù))int *w; IIw存放葉子結(jié)點(diǎn)權(quán)值char *c1;IIc1存放字符串中字符的種類char aM;II用于儲(chǔ)存輸入的字符串cout<<"請(qǐng)輸入字符串:"while(ci n> >a)n=freqchar(a);II得到字符種類的個(gè)數(shù)w=(i nt*)malloc( n*sizeof(i nt); II開辟空間存放權(quán)值c1=(char*)malloc( n*si
16、zeof(char); II開辟空間存放權(quán)值int j;for(i nt i=0;i <n ;i+)for(j=i;j<27;j+)if(n umj!=0)wi=nu mj;得到權(quán)值c1i=j+'a'得到字符種類break;/字符與權(quán)值相對(duì)應(yīng)CreateHuffma nTree(HT,w ,n); /生成哈夫曼樹Huffma nCodi ng(HT,HC, n); /進(jìn)行哈夫曼編碼Prin tHuffma nCode(HC,w, n,c1); /顯示哈夫曼編碼printf(”請(qǐng)輸入字符串:");int freqchar(char *st)/*統(tǒng)計(jì)字符出現(xiàn)的
17、頻率 */int n=0;/ 統(tǒng)計(jì)字符的種類memset( nu m,0,sizeof( nu m);for(int i=0;i<M;i+)int t=sti-'a'nu mt+;for(i nt j=0;j<27;j+)if(n umj!=0)n+;return n;void CreateHuffma nTree(Huffma nTree & HT,i nt *w,i nt n)/w存放n個(gè)結(jié)點(diǎn)的權(quán)值,將構(gòu)造一棵哈夫曼樹HTint i,m;int s1,s2;Huffma nTree p;if(n<=1) return;m=2* n-1; n個(gè)葉子結(jié)
18、點(diǎn)的哈夫曼樹,有2* n-1個(gè)結(jié)點(diǎn)HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);/ 開辟 2*n 各結(jié)點(diǎn)空間for(p=HT+1,i=1;i<=n;+i,+p,+w) /進(jìn)行初始化p->weight=*w;p->pare nt=0; p->lchild=0; p->rchild=0; for(;i<=m;+i,+p) p_>weight=0; p->pare nt=0; p->lchild=0; p->rchild=0;建哈夫曼樹for(i=n+1;i<=m;+i) /Select(HT,
19、i-1,s1,s2);/從HT1.i-1 中選擇pare nt為0且weight最小的兩個(gè)結(jié)點(diǎn),其序號(hào)分別為s1和s2HTs1.parent=i;HTs2.parent=i;/ 修改 s1 和 s2 結(jié)點(diǎn)的父指針pare ntHTi.lchild=s1;HTi.rchild=s2;/ 修改 i 結(jié)點(diǎn)的左右孩子指針HTi.weight=HTs1.weight+HTs2.weight; /修改權(quán)值void Huffma nCodi ng(Huffma nTree HT,Huffma nCode & HC,i nt n)將有n個(gè)葉子結(jié)點(diǎn)的哈夫曼樹 HT進(jìn)行編碼,所編的碼存放在HC中 /方法是
20、從葉子到根逆向求每個(gè)葉子結(jié)點(diǎn)的哈夫曼編碼 int i,c,f,start;char *cd;HC=(HuffmanCode)malloc(n+1)*sizeof(char*); / 分配 n 個(gè)編碼的頭指針向量cd=(char *)malloc( n*sizeof(char); /開辟一個(gè)求編碼的工作空間cd n-1='0' /編碼結(jié)束符for(i=1;i<=n ;+i) /逐個(gè)地求哈夫曼編碼start =n-1; /編碼結(jié)束位置for(c=i,f=HTi.parent;f!=O;c=f,f=HTf.parent)/ 從葉子到根逆向求編碼if(HTf.lchild=c) cd-start='0' /若是左孩子編為'0'elsecd-start='1' /若是右孩子編為'1'HCi=(char *)malloc(n-start)*sizeof(char);/ 為第 i 個(gè)編碼分配空間strcpy(HCi,&cdstart); /將編碼從 cd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 涂料購(gòu)買合同范本
- 2024年林地合作經(jīng)營(yíng)合同書
- 場(chǎng)地借用協(xié)議
- 標(biāo)準(zhǔn)房屋抵押合同范本
- 成都市家庭清潔工程合同示范
- 2024年空心磚購(gòu)銷合同
- 車輛買賣合同范本經(jīng)典版
- 廣東省房產(chǎn)租賃協(xié)議模板
- 2024年招投標(biāo)的實(shí)習(xí)報(bào)告
- 大學(xué)生臨時(shí)就業(yè)協(xié)議書
- Unit2 Sports and Fitness Lesson 3教學(xué)設(shè)計(jì)-2023-2024學(xué)年高中英語(yǔ)北師大版(2019)必修第一冊(cè)
- 2024年部編新改版語(yǔ)文小學(xué)一年級(jí)上冊(cè)第五單元復(fù)習(xí)課教案
- 2024-2030年中國(guó)養(yǎng)老機(jī)器人市場(chǎng)發(fā)展調(diào)查與應(yīng)用需求潛力分析報(bào)告
- 人教部編版(五四)語(yǔ)文六年級(jí)上冊(cè)名著導(dǎo)讀《童年》說課稿
- 人教鄂教版(2024秋) 三年級(jí)上冊(cè)5.15建筑中的材料 教學(xué)設(shè)計(jì)
- 2024年高考新課標(biāo)全國(guó)卷政治試題分析及2025屆高考復(fù)習(xí)備考建議
- 廣東省佛山市2023屆普通高中教學(xué)質(zhì)量檢測(cè)(二)化學(xué)試題
- 工業(yè)產(chǎn)品質(zhì)量安全日管控、周排查、月調(diào)度工作制度
- 華東師大版(2024年新教材)七年級(jí)上冊(cè)數(shù)學(xué)期中綜合素質(zhì)評(píng)價(jià)試卷(含答案)
- 混凝土路面施工中的技術(shù)難點(diǎn)及解決方案
- 2024-2030年中國(guó)安胎藥市場(chǎng)運(yùn)營(yíng)態(tài)勢(shì)及未來銷售規(guī)模建議研究報(bào)告
評(píng)論
0/150
提交評(píng)論