版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計(jì)報(bào)告書(shū)題目: 哈夫曼編碼/譯碼器 班級(jí): 學(xué)號(hào): 姓名: 田 歡 指導(dǎo)教師: 龔 丹 周期: 2011-12-19至2011-12-23 成績(jī): 年 月 日專心-專注-專業(yè)一、課程設(shè)計(jì)的目的與要求 (一)課程設(shè)計(jì)目的與任務(wù)(參考已發(fā)文檔自行編輯,但不少于100字)設(shè)計(jì)一個(gè)利用哈夫曼算法的編碼和譯碼系統(tǒng),重復(fù)地顯示并處理以下項(xiàng)目,直到選擇退出為止。利用哈夫曼樹(shù)編碼問(wèn)題基本原理的應(yīng)用,撐握對(duì)樹(shù)的不同存儲(chǔ)結(jié)構(gòu)的定義和算法描述。學(xué)會(huì)構(gòu)造哈夫曼樹(shù)和哈夫曼編碼等主要算法。(二)題目要求1) 將權(quán)值數(shù)據(jù)存放在數(shù)據(jù)文件(文件名為data.txt,位于執(zhí)
2、行程序的當(dāng)前目錄中) 2) 分別采用動(dòng)態(tài)和靜態(tài)存儲(chǔ)結(jié)構(gòu)3) 初始化:鍵盤輸入字符集大小n、n個(gè)字符和n個(gè)權(quán)值,建立哈夫曼樹(shù);4) 編碼:利用建好的哈夫曼樹(shù)生成哈夫曼編碼;5) 輸出編碼;6) 設(shè)字符集及頻度如下表:字符 空格 A B C D E F G H I J K L M頻度 186 64 13 22 32 103 21 15 47 57 1 5 32 20字符 N O P Q R S T U V W X Y Z 頻度 57 63 15 1 48 51 80 23 8 18 1 16 1二、設(shè)計(jì)正文1 系統(tǒng)分析(1)定義一個(gè)變量名為HTNo
3、de的結(jié)構(gòu)體,用該結(jié)構(gòu)體中的char data、int weight、int parent、int lchild、int rchild分別表示哈夫曼樹(shù)中每個(gè)結(jié)點(diǎn)的權(quán)值、權(quán)重、雙親結(jié)點(diǎn)、左孩子、右孩子,再定義一個(gè)HTNode類型的數(shù)組ht30存放哈夫曼樹(shù);另外定義一個(gè)變量名為HCode的結(jié)構(gòu)體,采用HCode類型變量的cdstartcdn存放當(dāng)前結(jié)點(diǎn)的哈夫曼編碼、最后定義一個(gè)HCode類型的數(shù)組hcd30的數(shù)組用于存放當(dāng)前葉子結(jié)點(diǎn)hti的哈夫曼編碼。(2)編寫CodeInput(n,ht)函數(shù)并在函數(shù)中設(shè)置一個(gè)for(i=0;n;+)循環(huán),首先輸入n個(gè)字符,再利用函數(shù)中的for(i=0;<
4、n;+)循環(huán)實(shí)現(xiàn)對(duì)這n個(gè)字符的權(quán)值的輸入。(3)編寫CreateHT(ht,n)函數(shù)來(lái)構(gòu)造一棵哈夫曼樹(shù),首先用一個(gè)for(i=0;<2*n-1;+)循環(huán)將所有2n-1個(gè)結(jié)點(diǎn)的parent、lchild、rchild域均置初值為-1;再用一個(gè)for(i=n;<2*n-1;+)循環(huán)來(lái)構(gòu)造哈夫曼樹(shù),在該循環(huán)中首先令lnode和rnode為最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置且其域值均為-1,再用一個(gè)for(k=0;<=i-1;k+)循環(huán)在數(shù)組ht30中尋找權(quán)值最小的兩個(gè)結(jié)點(diǎn)并且只能在尚未構(gòu)造二叉樹(shù)的結(jié)點(diǎn)中查找,由于只能在尚未構(gòu)造二叉樹(shù)的結(jié)點(diǎn)中查找,因此在for(k=0;k<=i-1;k+)
5、循環(huán)中加入一個(gè)if(htk.parent=-1)語(yǔ)句來(lái)判斷結(jié)點(diǎn)lnode和rnode是否已經(jīng)在二叉樹(shù)中,如果結(jié)點(diǎn)lnode和rnode在二叉樹(shù)中,則結(jié)點(diǎn)lnode和rnode的parent的值為其雙親結(jié)點(diǎn)在數(shù)組ht30中的序號(hào)就不會(huì)為-1了,在查找到htlnode和htrnode后將他們作為hti的左右子樹(shù),htlnode和htrnode的雙親結(jié)點(diǎn)置為hti,且hti.weight=htlnode.weight+ht rnode.weight。如此處理下去,直到所2n-1個(gè)結(jié)點(diǎn)處理完畢。(4)編寫CreateHCode(ht,hcd,n)函數(shù)來(lái)求哈夫曼編碼,由于求哈夫曼編碼只需求葉子結(jié)點(diǎn)的哈夫
6、曼編碼。對(duì)于當(dāng)前葉子結(jié)點(diǎn)hti,首先將對(duì)應(yīng)的哈夫曼編碼hcdi的start域值置初值n,找其雙親結(jié)點(diǎn)htf,若當(dāng)前結(jié)點(diǎn)是雙親結(jié)點(diǎn)的左孩子結(jié)點(diǎn),則在hcdi的cd數(shù)組中添加0,若當(dāng)前結(jié)點(diǎn)是雙親的右孩子結(jié)點(diǎn),則在hcdi的cd數(shù)組中添加1,將start域減1。再對(duì)雙親結(jié)點(diǎn)進(jìn)行同樣的操作,直到無(wú)雙親結(jié)點(diǎn)為止,最后讓start指向哈夫曼編碼最開(kāi)始字符。因此在函數(shù)中設(shè)置一個(gè)for(i=0;i<n;i+)循環(huán),在循環(huán)中設(shè)置一個(gè)while(f!=-1)循環(huán)語(yǔ)句來(lái)判斷循環(huán)是否到了根結(jié)點(diǎn),再在while(f!=-1)中設(shè)置一個(gè)if(htf.lchild=c)語(yǔ)句來(lái)判斷該處理左孩子結(jié)點(diǎn)還是該處理右孩子結(jié)點(diǎn)。
7、最后用這個(gè)for(i=0;i<n;i+)循環(huán)來(lái)根據(jù)哈夫曼樹(shù)求出哈夫曼編碼。(5)最后編寫CodeOutput(n,hcd)函數(shù),首先利用for(i=0;i<n;i+)循環(huán)和for(j=hcdi.start;j<=n;j+)循環(huán)來(lái)實(shí)現(xiàn)所有字符的哈夫曼編碼的輸出;再利用for(i=0;i<n;i+)循環(huán)和for(j=hcdi.start;j<=n;j+)循環(huán)來(lái)實(shí)現(xiàn)每個(gè)字符的序號(hào)和哈夫曼編碼的輸出。2 功能詳細(xì)描述及框圖(1)主函數(shù)流程圖如圖2.1Int I,f,c;i+Hc.start+;multiplexi=0hc.start=n;c=i;i<nf!=-1圖2
8、.2哈夫曼編碼算法流程圖Int i;scanf(“%d”,&htt.wei+i<n結(jié)束開(kāi)始圖2.1主函數(shù)流程圖(2)哈夫曼編碼算法流程圖,如圖2.2(3)構(gòu)造樹(shù)函數(shù)流程圖,如圖2.3Int k,lnode,mode;Hti.parent=hti.childi+i=nHtlnode,parent=i;Min1=min2=32767Multiplexi=0;i<2*2*n-1i<2*n-1i+圖2.3構(gòu)造樹(shù)函數(shù)流程圖3、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)31抽象數(shù)據(jù)類型定義(1)樹(shù)的抽象數(shù)據(jù)類型定義32模塊劃分本程序包括三個(gè)模塊:(1)主程序模塊void main()初始化;構(gòu)造哈夫曼樹(shù);求哈
9、夫曼編碼;哈夫曼編碼輸出;(2)哈夫曼模塊實(shí)現(xiàn)哈夫曼樹(shù)的抽象數(shù)據(jù)類型(3)求哈夫曼編碼模塊實(shí)現(xiàn)求哈夫曼編碼算法的數(shù)據(jù)類型4、主要功能邏輯過(guò)程和實(shí)現(xiàn)算法41數(shù)據(jù)類型的定義(1)哈夫曼樹(shù)類型typedef struct/構(gòu)造樹(shù) char data;/結(jié)點(diǎn)權(quán)值 int weight;/權(quán)重 int parent;/雙親結(jié)點(diǎn) int lchild;/左孩子 int rchild;/右孩子 HTNode; HTNode ht30;(2)求哈夫曼編碼類型typedef struct char cd30;/存放當(dāng)前結(jié)點(diǎn)的哈弗曼編碼 int start;/cdstartcdn存放哈弗曼碼 HCode; HCo
10、de hcd30;42主要模塊的算法描述(1)主函數(shù)int main() int n; printf("請(qǐng)輸入要輸入的字符數(shù)量n:");/讀入字符的個(gè)數(shù) while(scanf("%d",&n),n!=-1)/初始化 printf("請(qǐng)輸入n個(gè)字符和n個(gè)權(quán)值n"); CodeInput(n,ht);/輸入數(shù)據(jù)函數(shù),將讀入n個(gè)字符和權(quán)重 CreateHT(ht,n);/構(gòu)造哈弗曼樹(shù) CreateHCode(ht,hcd,n);/哈弗曼編碼算法 CodeOutput(n,hcd);/打印哈弗曼編碼將打印出編碼,和每一個(gè)字符的編碼
11、return 0;(2)構(gòu)造哈夫曼樹(shù)void CreateHT(HTNode ht,int n)/構(gòu)造一棵哈夫曼樹(shù) int i,k,lnode,rnode; int min1,min2; for (i=0;i<2*n-1;i+)/所有結(jié)點(diǎn)的相關(guān)域置初值-1 hti.parent=hti.lchild=hti.rchild=-1; for (i=n;i<2*n-1;i+)/構(gòu)造哈弗曼樹(shù) min1=min2=32767;/lnode和rnode為最小權(quán)值的兩個(gè)結(jié)點(diǎn)位置 lnode=rnode=-1; for (k=0;k<=i-1; k+)/在ht中查找權(quán)值的最小的兩個(gè)結(jié)點(diǎn) if
12、 (htk.parent=-1)/只在未構(gòu)造的二叉樹(shù)結(jié)點(diǎn)中查找 if (htk.weight<min1) min2=min1;rnode=lnode; min1=htk.weight; lnode=k; else if (htk.weight<min2) min2=htk.weight; rnode=k; htlnode.parent=i; htrnode.parent=i; hti.weight=htlnode.weight+htrnode.weight; hti.lchild=lnode; hti.rchild=rnode;/ht為雙親結(jié)點(diǎn) (3)利用哈夫曼編碼算法哈夫曼編碼v
13、oid CreateHCode(HTNode ht,HCode hcd,int n) int i,f,c; HCode hc; for(i=0; i<n; i+)/根據(jù)哈弗曼樹(shù)求哈弗曼編碼 hc.start=n; c=i; f=hti.parent; while (f!=-1)/循環(huán)知道樹(shù)的根結(jié)點(diǎn) if(htf.lchild=c) hc.cdhc.start-='0'/處理左孩子結(jié)點(diǎn) else hc.cdhc.start-='1'/處理右孩子結(jié)點(diǎn) c=f; f=htf.parent; hc.start+;/start指向哈弗曼編碼最開(kāi)始的位置 hcdi=h
14、c; 5、界面設(shè)計(jì)6、系統(tǒng)測(cè)試測(cè)試數(shù)據(jù)及結(jié)果如下: 結(jié)果分析:首先確定要輸入的字符數(shù)量n為8,然后分別輸入這8個(gè)字符和這8個(gè)字符的權(quán)值,且輸入的這8個(gè)字符分別為B、C、D、E、F、G、H、I而這8個(gè)字符對(duì)應(yīng)的權(quán)值分別為13、22、32、103、21、15、47、57。其次根據(jù)輸出的結(jié)果可知:所有字符的哈夫曼為011。其中序號(hào)0表示字符B,其哈夫曼編碼為0010;序號(hào)1表示字符C,其哈夫曼編碼為110;序號(hào)2表示字符D,其哈夫曼編碼為010;序號(hào)3表示字符E,其哈夫曼編碼為0011;序號(hào)4表示字符F,其哈夫曼編碼為111;序號(hào)5表示字符G,其哈夫曼編碼為10;序號(hào)6表示字符H,其哈夫曼編碼為00
15、0;序號(hào)7表字符I,其哈夫曼編碼為011,這個(gè)8個(gè)字符 對(duì)應(yīng)的哈夫曼樹(shù)如圖6.1。04F1 C6 H3E101010107 I2 D0110 B5 G01圖6.1構(gòu)造哈夫曼樹(shù)及哈夫曼編碼三、小組成員分工說(shuō)明獨(dú)立完成四、課程設(shè)計(jì)總結(jié)或結(jié)論1 課程設(shè)計(jì)過(guò)程中出現(xiàn)的技術(shù)難點(diǎn)和解決方法:1.1技術(shù)難點(diǎn)。(1) 輸入的字符個(gè)數(shù)不確定,可跟據(jù)情況輸入。(2) 哈夫曼樹(shù)的類型。(3) 哈夫曼編碼類型。(4) 構(gòu)造哈夫曼樹(shù)算法。(5) 計(jì)算哈夫曼編碼算法。1.2解決方法。(1)通過(guò)向老師虛心學(xué)習(xí)請(qǐng)教.(2)和同學(xué)們細(xì)心交流,認(rèn)真討論。(3)上網(wǎng)參考,吸取別人的精華。2 課程設(shè)計(jì)期間的主要收獲:通過(guò)這次課程設(shè)計(jì)使我充分的理解了用哈夫曼樹(shù)再編碼問(wèn)題中基本原理的應(yīng)用,知道了樹(shù)的不同存儲(chǔ)結(jié)構(gòu)的定義和算法描述,同時(shí)也學(xué)會(huì)了編寫簡(jiǎn)單的哈夫曼編碼問(wèn)題的程序。雖然此次的程序不是很完備,但是總體還是一個(gè)比較能體現(xiàn)數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn)的程序,當(dāng)然只是相對(duì)于我這個(gè)學(xué)者來(lái)說(shuō)。在剛開(kāi)始
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024錄像資料網(wǎng)絡(luò)傳輸安全保密協(xié)議書(shū)3篇
- 2024年適用各行業(yè)勞動(dòng)協(xié)議范例大全版B版
- 2024年融資介紹協(xié)議樣本3篇
- 2024版買賣房屋定金協(xié)議范本
- 2024年酒店管理合同:酒店所有權(quán)人與管理者之間的經(jīng)營(yíng)管理協(xié)議
- 2024年標(biāo)準(zhǔn)產(chǎn)品采購(gòu)協(xié)議范本版B版
- 二零二五年度二手車交易及二手車交易糾紛處理協(xié)議3篇
- 2024無(wú)底薪導(dǎo)游帶團(tuán)服務(wù)合作協(xié)議范本3篇
- 2025版連鎖餐廳加盟合作協(xié)議范本3篇
- 2025版車輛抵押貸款數(shù)據(jù)共享合同3篇
- 礦產(chǎn)貿(mào)易風(fēng)險(xiǎn)管控
- 湖南省湘西自治州四校2025屆高二數(shù)學(xué)第一學(xué)期期末質(zhì)量檢測(cè)試題含解析
- 期末 (試題) -2024-2025學(xué)年川教版(三起)英語(yǔ)五年級(jí)上冊(cè)
- 2025屆四川省新高考八省適應(yīng)性聯(lián)考模擬演練 生物試卷(含答案)
- 安全生產(chǎn)方案及保證措施
- 非物質(zhì)文化遺產(chǎn)主題班會(huì)之英歌舞課件
- 柯橋區(qū)五年級(jí)上學(xué)期語(yǔ)文期末學(xué)業(yè)評(píng)價(jià)測(cè)試試卷
- 中國(guó)礦業(yè)大學(xué)《自然辯證法》2022-2023學(xué)年期末試卷
- TCWAN 0105-2024 攪拌摩擦焊接機(jī)器人系統(tǒng)技術(shù)條件
- 江蘇省期無(wú)錫市天一實(shí)驗(yàn)學(xué)校2023-2024學(xué)年英語(yǔ)七年級(jí)第二學(xué)期期末達(dá)標(biāo)檢測(cè)試題含答案
- 2022年山東師范大學(xué)自考英語(yǔ)(二)練習(xí)題(附答案解析)
評(píng)論
0/150
提交評(píng)論