哈弗曼樹的建立_編碼和譯碼操作_第1頁
哈弗曼樹的建立_編碼和譯碼操作_第2頁
哈弗曼樹的建立_編碼和譯碼操作_第3頁
哈弗曼樹的建立_編碼和譯碼操作_第4頁
哈弗曼樹的建立_編碼和譯碼操作_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 北京工商大學課程設(shè)計報告 編號:北京工商大學_數(shù)據(jù)結(jié)構(gòu)_課程設(shè)計(報告)院 (系):_ _班 級:_ _學 號:_ _姓 名:_ _同組學生:_指導教師_成 績_實踐地點:_實踐時間: Huffman樹的建立及編碼【課程設(shè)計目的】 通過對哈夫曼樹的概念、構(gòu)造算法的理解,進行編碼,從而掌握赫夫曼樹的編碼原則。 【課程設(shè)計任務(wù)】霍夫曼(Huffman)編碼原理是一種利用二叉樹實現(xiàn)的編碼原理霍夫曼(Huffman)編碼是1952年為文本文件而建立,是一種統(tǒng)計編碼。屬于無損壓縮編碼。 霍夫曼編碼的碼長是變化的,對于出現(xiàn)頻率高的信息,編碼的長度較短;而對于出現(xiàn)頻率低的信息,編碼長度較長。這樣,處理全部

2、信息的總碼長一定小于實際信息的符號長度?;舴蚵幋a具有一些明顯的特點: 1) 編出來的碼都是異字頭碼,保證了碼的唯一可譯性。 2) 由于編碼長度可變。因此譯碼時間較長,使得霍夫曼編碼的壓縮與還原相當費時。 3) 編碼長度不統(tǒng)一,硬件實現(xiàn)有難度。 4) 對不同信號源的編碼效率不同,當信號源的符號概率為2的負冪次方時,達到100的編碼效率;若信號源符號的概率相等,則編碼效率最低。 5) 由于"0"與"1"的指定是任意的,故由上述過程編出的最佳碼不是唯一的,但其平均碼長是一樣的,故不影響編碼效率與數(shù)據(jù)壓縮性能輸入:從終端讀入字符集大小n,以及n個字符和n個權(quán)值

3、,建立哈弗曼樹.輸出:從終端讀入的字符集最終輸出編譯后的哈弗曼編碼,字符集形式輸出.【設(shè)計思路】 (1) 定義哈弗曼樹的結(jié)點結(jié)構(gòu);(2)定義哈弗曼編碼的結(jié)構(gòu).;(3)構(gòu)造哈弗曼樹;(4)構(gòu)造n棵只有一個葉結(jié)點的二叉樹,并找出根結(jié)點權(quán)值最小的兩棵樹;(5)輸出字符的哈弗曼編碼?!靖乓O(shè)計 (流程)】1程序用到的抽象數(shù)據(jù)類型的定義:typedef struct unsigned int weight; unsigned int parent,lchild,rchild; HTNode,*HuffmanTree;2主模塊的流程以及各子模塊的主要功能:主main函數(shù)調(diào)用了HuffmanTree HT函

4、數(shù), HuffmanCode HC=NULL;函數(shù),HuffmanCoding(HT,HC,w,n);函數(shù),最終實現(xiàn)編譯功能.【構(gòu)造哈夫曼樹的算法】 (1)根據(jù)與n個權(quán)值W1,W2,Wn對應(yīng)的n個結(jié)點 構(gòu)成具有n棵二叉樹的森 林。F=T1,T2,,Tn其中,每棵二叉樹Ti(1<=i<=n)都只有一個權(quán)值為Wi的根結(jié) 點,其左、右子樹均為空;(2)在森林F中選出兩棵根結(jié)點的權(quán)值最小的樹作為一棵新樹的左、右子樹,且置新樹的根結(jié)點的權(quán)值為其左、右子樹上根 結(jié)點的權(quán)值之和;(3)從F中刪除構(gòu)成新樹的那兩棵樹,同時把新樹加入F中;(4)重復(2)和(3)步,直到F中只含有一棵樹為 止,此樹便

5、是哈夫曼樹。【詳細設(shè)計】具體代碼實現(xiàn)如下: #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct unsigned int weight; unsigned int parent,lchild,rchild; HTNode,*HuffmanTree; typedef char *HuffmanCode; typedef struct unsigned int s1; unsigned int s2; MinCode; void Error(char *message

6、); void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,unsigned int *w,unsigned int n); MinCode Select(HuffmanTree HT,unsigned int n); void Error(char *message) fprintf(stderr,"Error:%sn",message); exit(1); void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,unsigned int *w,u

7、nsigned int n)unsigned int i,s1=0,s2=0; HuffmanTree p; char *cd; unsigned int f,c,start,m; MinCode min; if(n<=1) Error("Code too small!"); m=2*n-1; HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); for(p=HT,i=0;i<=n;i+,p+,w+) p->weight=*w; p->parent=0; p->lchild=0; p->rchild=0;

8、 for(;i<=m;i+,p+) p->weight=0; p->parent=0; p->lchild=0; p->rchild=0; for(i=n+1;i<=m;i+) min=Select(HT,i-1); s1=min.s1; s2=min.s2; HTs1.parent=i; HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; printf("HT List:n"); printf("Numberttwei

9、ghtttparentttlchildttrchildn"); for(i=1;i<=m;i+) printf("%dtt%dtt%dtt%dtt%dn",i,HTi.weight,HTi.parent,HTi.lchild,HTi.rchild); HC=(HuffmanCode)malloc(n+1)*sizeof(char *); cd=(char *)malloc(n*sizeof(char *); cdn-1='0' for(i=1;i<=n;i+) start=n-1; for(c=i,f=HTi.parent;f!=0;c

10、=f,f=HTf.parent) if(HTf.lchild=c) cd-start='0' else cd-start='1' HCi=(char *)malloc(n-start)*sizeof(char *); strcpy(HCi,&cdstart); free(cd); MinCode Select(HuffmanTree HT,unsigned int n) unsigned int min,secmin; unsigned int temp; unsigned int i,s1,s2,tempi; MinCode code; s1=1;s2

11、=1; for(i=1;i<=n;i+) if(HTi.parent=0)min=HTi.weight; s1=i; break; tempi=i+; for(;i<=n;i+) if(HTi.weight<min&&HTi.parent=0) min=HTi.weight; s1=i; for(i=tempi;i<=n;i+) if(HTi.parent=0&&i!=s1) secmin=HTi.weight; s2=i; break; for(i=1;i<=n;i+) if(HTi.weight<secmin&&a

12、mp;i!=s1&&HTi.parent=0) secmin=HTi.weight; s2=i; if(s1>s2) temp=s1; s1=s2; s2=temp; code.s1=s1; code.s2=s2; return code; void main() HuffmanTree HT=NULL; HuffmanCode HC=NULL; unsigned int *w=NULL; unsigned int i,n; printf("Input n:n"); scanf("%d",&n); w=(unsigned i

13、nt *)malloc(n+1)*sizeof(unsigned int *); w0=0; printf("Enter weight:n"); for(i=1;i<=n;i+) printf("w%d=",i); scanf("%d",&wi); HuffmanCoding(HT,HC,w,n); printf("HuffmanCode:n"); printf("NumberttWeightttCoden"); for(i=1;i<=n;i+) printf("%dtt%dtt%sn",i,wi,HCi); 【運行結(jié)果】截圖一 【心得體會】本實驗是有老師提供模板,然后自己增加功能函數(shù)的代碼實現(xiàn)的。因此,在完成未完成的功能函數(shù)之前還必須要細心閱讀所給出代碼,整體觀察各個部分之前的聯(lián)系,搞清楚已給出和未完成的代碼功能之后,才根據(jù)算法,設(shè)計出該功能的函數(shù)代碼。在實驗過程中,大大小小的問題是難免的,有些解決不了的,就問了這方面比較擅長的同學,也在網(wǎng)上進行了提問,通過大家的幫忙克服了不少的問題,小問題都是馬虎造成的,都要進行反復地

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論