哈夫曼編碼實驗報告_第1頁
哈夫曼編碼實驗報告_第2頁
哈夫曼編碼實驗報告_第3頁
哈夫曼編碼實驗報告_第4頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、哈夫曼編碼實驗報告 實驗報告與總結(jié) 一、 實驗?zāi)康?1、掌握哈夫曼編碼原理; 2、熟練掌握哈夫曼樹得生成方法; 3、理解數(shù)據(jù)編碼壓縮與譯碼輸出編碼得實現(xiàn). 二、實驗要求 實現(xiàn)哈夫曼編碼與譯碼得生成算法。 三、實驗內(nèi)容 先統(tǒng)計要壓縮編碼得文件中得字符字母出現(xiàn)得次數(shù),按字符字母與空格出現(xiàn)得概率對其進(jìn)行哈夫曼編碼,然后讀入要編碼得文件,編碼后存入另一個文件;接著再調(diào)出編碼后得文件,并對其進(jìn)行譯碼輸出,最后存入另一個文件中。 五、實驗原理 1、哈夫曼樹得定義:假設(shè)有 n 個權(quán)值,試構(gòu)造一顆有 n 個葉子節(jié)點得二叉樹,每個葉子帶權(quán)值為 wi,其中樹帶權(quán)路徑最小得二叉樹成為哈夫曼樹或者最優(yōu)二叉樹; 2、哈

2、夫曼樹得構(gòu)造: w為輸入得頻率數(shù)組,把其中得值賦給依次建立得 h nod對象中得 dta 屬性,即每一個 ht node 對應(yīng)一個輸入得頻率。然后根據(jù) dta 屬性按從小到大順序排序,每次從ata 取出兩個最小與此次小得 ht node,將她們得 da相加,構(gòu)造出新得tne 作為她們得父節(jié)點,指針 paret,lfd,rgtchil賦相應(yīng)值。在把這個新得節(jié)點插入最小堆。按此步驟可以構(gòu)造構(gòu)造出一棵哈夫曼樹。 通過已經(jīng)構(gòu)造出得哈夫曼樹,自底向上,由頻率節(jié)點開始向上尋找 pent,直到 pen為樹得頂點為止。這樣,根據(jù)每次向上搜索后,原節(jié)點為父節(jié)點得左孩子還就是右孩子,來記錄或 0,這樣,每個頻率都

3、會有一個編碼與之唯一對應(yīng),并且任何編碼沒有前部分就是同其她完整編碼一樣得。 六、實驗流程 初始化,統(tǒng)計文本文件中各字符得個數(shù)作為權(quán)值,生成哈夫曼樹; 根據(jù)符號概率得大小按由大到小順序?qū)Ψ栠M(jìn)行排序; 把概率最小得兩個符號組成一個節(jié)點; 重復(fù)步驟(2)(3),直到概率與為; 從根節(jié)點開始到相應(yīng)于每個符號得"樹葉',概率大得標(biāo)"0',概率小得標(biāo)"1' 從根節(jié)點開始,對符號進(jìn)行編碼; 譯碼時流程逆向進(jìn)行,從文件中讀出哈夫曼樹,并利用哈夫曼樹將編碼序列解碼。 七、實驗程序 #incldeistrem #ncludefsteam incudeioma

4、nip #iluevecto usin naespace sd; type strct /節(jié)點結(jié)構(gòu) char dt; /記錄字符值 重權(quán)符字錄記/ ;hgiew ni gnol unsined in paret,lchld,rhil; htnoe,*ufare; /動態(tài)分配數(shù)組存儲哈夫曼樹 typdef har * *hufmancode; /動態(tài)分配數(shù)組存儲哈夫曼編碼表 void seet(huffmntree ht,int i,it s1,i 2) /在 ht1、t中選擇parent 不為 0 且權(quán)值最小得兩個結(jié)點,其序號分別為1 與 s2 ;2s;0=1 ;0003=2n,0003=n

5、tni f(int k=1;k=;k+) if(ht、par=0) )1ngie、kh(f n2=n1; 1=ht、weigt; 2=s1; s1=; le i(h、wihtn2) n2ht、weght; 2k; oid hfmacodin(huffmntree ht,ffmacode hc,nt n)/將要編碼得字符串存入空樹中 ifstra fi1('zifu、txt); ifstra fin2(weigt、txt'); if(n)retr; int 2*1; int i; ;1+edot wen=h ch zifu; n *weit; zifu= car+1; weigt

6、=new itn+1; 中組數(shù) ufi在放符字得碼編待將/)+i;n=i;1=(rf ;hc ah c=fin1、get(); ;h=iufi 中組數(shù) thgiw 在放值權(quán)得應(yīng)對符字碼編帶將/)+;n=i;1=i(of inwiti; or( i=1;;i+) ;iufiz=tad、ith ;ithgiewhgiw、h for(in+1;i=m;i+) i、dt=; )+;m=i;1(rf ht、pen=ti、child=h、rcid=0; )i+;m=i;1+n=i(rof ;s,1s ti sele(t,s1,2); hs1、paenti; t、paen=i; ;2s=dlihr、ith

7、;1slil、it ;the、2st+tgiew、1s=thgiew、it 間空作工得碼編求個一辟開;)*rahc(oez)1+n(collam)onmffuh(=ch ;dc* rahc 值權(quán)放存間空辟開/;)ac(fez*(cllam)* rah(=dc cd-1="0; fr(i=1;i=;i+) ;1=tras tni ;f,c n for( =, f=hi、parent;f!=;c=f,f=hf、prent)/從葉子到根逆向求編碼 if(tf、lcld=) cdstart=0;/若就是左孩子編為"0" le "1為編子孩右是就若/;"

8、1"asdc 分碼編個第為/ ;)rah(ezs)trats-n(cllm)* ah(=ch配空間 strpy(hci,art); deet d; /釋放工作空間 d prnhffntree(uffmee ht,nt ) /顯示有 n 個葉子結(jié)點得哈夫曼樹得編碼表 ostream fout(hmtree、txt); /將對應(yīng)字符得得哈弗曼樹存入 ''tnerap' 'thiw'' atd'' 'muntuoclchild' 'rchlid'ndl; o(int i=;i=*n1;+) fo

9、ti、eigtetw(3)i、paetsew()h、cilstw(3)hi、hldendl; thgew、th)3(waad、it)5(esitetw(3)hi、pntstw()hti、lchildsew(3)hti、childndl; vod printhuffmancodig(uffmnree ht,hufncode c,nt n)/輸出字符得對應(yīng)哈弗曼編碼并存入 code、xt 文件 cthufman ce is:'endl; ;)'xt、eoc'(tuof maertsfo fo(in =;i=n;i+) cuthti、aa' - ; ;ldne)ch(

10、tuoc ;ldne)ich(tuo vo co_ ht,hufmae hc,it n)/對文件 tbern、txt 進(jìn)行編碼,并將編碼存入 codefile 文件中 ifsam fin(oran、txt); ;)'do'(tof aertsfo ;a ahcrce ;c rhc )*"=!)(teg、if=hc(el 、puhback(c); cout待編碼得字符串為:; )+k;)(eis、a;= tni(rof ;ku ;ldnetuoc ;l:果結(jié)碼編 ntoc )+i;)(eis、i;0=i ni(rof )+;n=j;1j tni(rof )atad、jh

11、=ia(i fhj; ;kaerb fi、clos(); ;)(eoc、tof void decodi(humatr ,huffmanod c,i )/打開 codeile 文件并對文件內(nèi)容進(jìn)行譯碼 in os m*n1; istream fin(code'); ;)txet(tuof atfo vetrcar a; );cnf; h(of a、ps_bac(c); ;0=tc tni fo(int k=0;ka、ze();+) oak; cont+; if(ont%5=0) ;ldnto int =0; 值得 m 住記來 p 用/ ;p tni otenl; out'n 譯碼

12、結(jié)果:'endl; while(ia、se() 歷遍始開根得數(shù)曼弗哈從 ;= )dlil、th(ei )1=a(fi ;dlhcr、pth ls ;ihcl、pt=p ;+i fohtp、ata; ;ta、pthtuoc od main() t n; out'輸入權(quán)值個數(shù):' /設(shè)置權(quán)值數(shù)值 ;nic ;)n'(ftnir th 樹曼夫哈/ ;t eertffuh c表碼編曼夫哈/ ;ch ednamffuh 碼編曼夫哈行進(jìn)/ ;)n,h,th(nidocnauh rithufancodig(ht,,n); 顯示編碼得字符 ;)(tnir ode_); /顯示要

13、編碼得字符串,并把編碼值顯示出來 串符字得后碼譯示顯并碼譯/ ;)n,ch,h(gnioce ;)'n'(fip ;)euap(mtsys 八、結(jié)果分析 哈夫曼編碼就是動態(tài)變長編碼,臨時建立概率統(tǒng)計表與編碼樹。概率小得碼比較長,概率小得碼比較長。概率大得碼短,這樣把一篇文件編碼后,就會壓縮許多。從樹得角度瞧,哈夫曼編碼方式就是盡量把短碼都利用上。首先,把一階節(jié)點全都用上,如果碼字不夠時,然后,再從某個節(jié)點伸出若干枝,引出二階節(jié)點作為碼字,以此類推,顯然所得碼長最短,再根據(jù)建立得概率統(tǒng)計表合理分布與放置,使其平均碼長最短就可以得到最佳碼。 九、實驗總結(jié) 通過這次實驗,我對二叉樹與

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論