




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、霍夫曼樹實驗?zāi)康模赫莆战Y(jié)構(gòu)體、指針及二叉樹的生成、遍歷等操作掌握霍夫曼編碼/譯碼的原理?;疽螅菏炀氄莆諛涞牟僮鳌3绦?qū)崿F(xiàn):程序第一遍統(tǒng)計原數(shù)據(jù)中各字符出現(xiàn)的頻率,利用得到的頻率值創(chuàng)建哈夫曼樹,并把樹的信息保存起來,以便解壓時創(chuàng)建同樣的哈夫曼樹進(jìn)行解壓;第二遍,根據(jù)第一遍掃描得到的哈夫曼樹進(jìn)行編碼,并把編碼后的碼字存儲。要點分析:題目中涉及的主要知識點: 1、本程序參考霍夫曼算法(由給定的權(quán)值構(gòu)造赫夫曼樹): (1)由給定的n個權(quán)值w0, w1, w2, , wn-1,構(gòu)造具有n棵二叉樹的集合F =T0, T1, T2, , Tn-1,其中每一棵二叉樹Ti只有一個帶有權(quán)值wi的根結(jié)點,其左、
2、右子樹均為空。 (2)重復(fù)以下步驟, 直到F中僅剩下一棵樹為止: 在F中選取兩棵根結(jié)點的權(quán)值最小的二叉樹, 做為左、右子樹構(gòu)造一棵 新的二叉樹。置新的二叉樹的根結(jié)點的權(quán)值為其左、右子樹上根結(jié)點的權(quán)值之和。 在F中刪去這兩棵二叉樹。 把新的二叉樹加入F。 2、用構(gòu)造赫夫曼樹以完成赫夫曼編碼:把d1,d2, dn 作為葉子結(jié)點,把w1,w2,wn作為葉子結(jié)點 的權(quán),構(gòu)造赫夫曼樹。在赫夫曼樹中結(jié)點的左分支賦0,右 分支賦1,從根結(jié)點到葉子結(jié)點的路徑上的數(shù)字拼接起來就 是這個葉子結(jié)點字符的編碼。 3、譯碼的過程是分解電文中的字符串,從根出發(fā),按字符0或1確定找左孩子或右孩子,直至葉子節(jié)點,便求得該子串
3、相應(yīng)的字符。心得體會:通過本次實驗,我熟練掌握了結(jié)構(gòu)體、指針及二叉樹的生成、遍歷等操作,掌握了霍夫曼編碼和譯碼的原理,熟練掌握樹的操作,尤其是對霍夫曼樹有了更深刻的理解。同時,在編寫代碼的過程中方,對字符串的相關(guān)知識進(jìn)行了回顧。代碼#include<stdio.h>#include<stdlib.h>#include<string.h>typedef structint weight;int parent,lchild,rchild;int sign;HTNode,*HuffmanTree;typedef char * *HuffmanCode;void H
4、uffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n,char *s);void select(HuffmanTree &HT,int i,int &s1,int &s2);void creatHuffmanTree(int *w,char *s,char *r);void pr(HuffmanCode &HC,char r,char s,char a);void HuffmanYM(HuffmanCode &HC,char r,char a,int n,HuffmanTree
5、 &HT);void HuffmanPass(HuffmanCode &HC,char r,int n,HuffmanTree &HT);int main()char s100;char r100;char a100="a"int w100;int n,p;HuffmanTree HT;HuffmanCode HC;printf("請輸入進(jìn)行編碼的字符串n");scanf("%s",s);p=strlen(s);if(p!=1)creatHuffmanTree(w,s,r);printf("進(jìn)行編碼.
6、n"); if(p!=1) HuffmanCoding(HT,HC,w,strlen(r)-1,r);else printf("%c的霍夫曼編碼是: %cn",s0,'0');printf("霍夫曼碼序列為:n");if(p!=1) for(int i=0;i<strlen(s);i+) pr(HC,r,si,a);printf("n");n=strlen(r)-1;if(p=1)printf("0n");printf("霍夫曼編碼進(jìn)行譯碼:n");if(p=1)
7、printf("%c",s0);else HuffmanYM(HC,r,a,n,HT);printf("n"); printf("先序遍歷輸出葉子節(jié)點n");if(p=1)printf("%cn",s0);else HuffmanPass(HC,r,n,HT);return 0;void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int w,int n,char s)int s1,s2,f,c;int m,i,l;int start;char cd1
8、01;if(n<1)return;l=strlen(s);m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);HT0.weight=10000; for (i=1;i<=n;+i) HTi.weight=wi-1; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; HTi.sign=0; for(;i<=m+1;+i) HTi.weight=0; HTi.parent=0; HTi.lchild=0; HTi.rchild=0; HTi.sign=0; for(i=n+1;i<=m;i+
9、) select(HT,i-1,s1,s2);/選擇最小的兩個結(jié)點 HTs1.parent=i;HTs2.parent=i;/將它們的父節(jié)點賦值 HTi.lchild=s1;HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; HC=(HuffmanCode)malloc(n+1)*sizeof(char *); cdn-1='0' for(i=1;i<=n;i+) start=n; c=i; for(f=HTi.parent;f!=0;f=HTf.parent) if(HTf.lchild=c) start-; cdsta
10、rt='0' else start-; cdstart='1' c=f; HCi=(char *)malloc(n-start)*sizeof(char); for(int a=0;a<n-start;a+) HCia=cdstart+a; HCia='0' printf("%c的霍夫曼編碼是: %sn",si,HCi);void select(HuffmanTree &HT,int i,int &s1,int &s2)s1=0;s2=0;for(int j=1;j<=i;j+)if(HTj
11、.parent=0)if(HTj.weight<=HTs1.weight)s1=j;else continue;else continue;for(j=1;j<=i;j+)if(j=s1)continue;else if(HTj.parent=0) if(HTj.weight<=HTs2.weight) s2=j; else continue; else continue;void creatHuffmanTree(int w,char s,char r)int g=1;int q=0;r0='0'r1=s0;w0=1;for(int e=1;e<str
12、len(s);e+)for(int k=1;k<=g;k+)if(rk=se)wk-1+;q=1;else continue;if(q=0)r+g=se;wg-1=1;q=0;r+g='0'void pr(HuffmanCode &HC,char r,char s,char a)for(int i=1;i<strlen(r);i+)if(ri=s)printf("%s",HCi);strcat(a,HCi);else continue;void HuffmanYM(HuffmanCode &HC,char r,char a,int
13、 n,HuffmanTree &HT)int e=strlen(a);int k=0;int f=2*n-1;char b10="1"for(int j=1;j<=e;j+)if(HTf.lchild!=0|HTf.rchild!=0)bk=aj;k+; if(aj='1') f=HTf.rchild;else if(aj='0')f=HTf.lchild;else for(int s=1;s<=n;s+)if(strcmp(HCs,b)=0)printf("%c",rs);break;else con
14、tinue;for(int u=0;u<10;u+)bu='0'k=0;f=2*n-1;j=j-1;void HuffmanPass(HuffmanCode &HC,char r,int n,HuffmanTree &HT)int f,k=0;char b10="a"f=2*n-1;HTf.sign=0;if(HTf.lchild=0&&HTf.rchild=0)return;doif(HTf.lchild=0&&HTf.rchild=0)for(int s=1;s<=n;s+)if(strcmp(HCs,b)=0)printf("%c",rs);break;else continue; bk-='0'HTf.s
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 河南藝術(shù)機(jī)構(gòu)管理辦法
- 高職人才培養(yǎng)質(zhì)量增值評價研究
- 比質(zhì)比價采購管理辦法
- 鋼結(jié)構(gòu)維護(hù)與結(jié)構(gòu)施工技術(shù)指南
- 新教師教學(xué)工作中存在的問題分析
- 小學(xué)隊列隊形教學(xué)計劃
- 春節(jié)技師放假管理辦法
- 體育與藝術(shù)融合發(fā)展的實施路徑研究
- 梧州學(xué)院專業(yè)管理辦法
- 接地系統(tǒng)安裝工藝與技術(shù)研究
- 2025年7月新疆維吾爾自治區(qū)學(xué)業(yè)水平合格性考試歷史試題(含答案)
- 建立并優(yōu)化醫(yī)院的藥品管理體系
- 農(nóng)村農(nóng)資采購與供應(yīng)長期合作協(xié)議
- 危險品運(yùn)輸學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- (正式版)SHT 3551-2024 石油化工儀表工程施工及驗收規(guī)范
- 5噸龍門吊安裝與拆除專項施工方案
- 康復(fù)科護(hù)理質(zhì)量監(jiān)測指標(biāo)
- 農(nóng)藥基本常識課件
- 六年級數(shù)學(xué)分?jǐn)?shù)除法、解方程計算題 (含答案)
- 高速鐵路竣工驗收辦法
- 新教材 人教版高中英語必修第一冊全冊各單元知識點提煉匯總(單詞短語語法寫作等)
評論
0/150
提交評論