可逼近信道容量编码技术之霍夫曼编码的实现
生活随笔
收集整理的這篇文章主要介紹了
可逼近信道容量编码技术之霍夫曼编码的实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
可逼近信道容量編碼技術之霍夫曼編碼的實現
簡介
在當今信息爆炸時代,如何采用有效的數據壓縮技術來節省數據文件的存儲空間和計算機網絡的傳送時間已越來越引起人們的重視。哈夫曼編碼正是一種應用廣泛且非常有效的數據壓縮技術。
哈夫曼編碼的應用很廣泛,利用哈夫曼樹求得的用于通信的二進制編碼稱為哈夫曼編碼。樹中從根到每個葉子都有一條路徑,對路徑上的各分支約定:指向左子樹的分支表示“0”碼,指向右子樹的分支表示“1”碼,取每條路徑上的“0”或“1”的序列作為和各個對應的字符的編碼,這就是哈夫曼編碼。
通常我們把數據壓縮的過程稱為編碼,解壓縮的過程稱為解碼。電報通信是傳遞文字的二進制碼形式的字符串。但在信息傳遞時,總希望總長度盡可能最短,即采用最短碼。
關鍵詞:哈夫曼樹、編碼、解碼、設計
論文+代碼下載地址:論文+代碼下載地址
目錄
運行結果 編碼–》譯碼
主程序流程圖
系統實現–主調函數
void Open(char s[])
//打開存放字符或編碼的文件,將其存入字符串數組中 {
char name[10];
FILE *fp;
int i=0;
printf("請輸入要打開的文件名:");
gets(name); //要打開的文件名
if((fp=fopen(name,"rt"))==NULL) { printf("打開失敗!\n");
//若打開失敗,則直接退出 exit(1); } s[i++]=fgetc(fp); while(s[i-1]!=EOF) s[i++]=fgetc(fp);s[i]='\0'; //存取字符串結束fclose(fp);}
系統實現–建立HuffmanTree
void CreatHFMTree(HFMTree *HT,int count[])
{ //創建哈夫曼樹 int i; HFMTree p,HT1,HT2; //HT1,HT2分別存放權值最小和次小的節點的位置 p=*HT=(HFMTree)malloc(sizeof(HFMNode));
p->next=p->LChild=p->RChild=p->Parent=NULL;
//初始化哈夫曼鏈表且有2n-1個節點
for(i=1;i<2*n-1;i++) { p->next=(HFMTree)malloc(sizeof(HFMNode)); p=p->next; p->next=p->LChild=p->RChild=p->Parent=NULL; } for(i=0,p=*HT;i<n;i++)
//將各個字符出現的次數作為權值
{
//存入哈夫曼鏈表的前n個單元中 p->weight=count[i]; p=p->next; } for(i=n;i<2*n-1;i++) //將后n-1個節點賦權值,建樹 { SelectMin(*HT,i,&HT1,&HT2); //每次從前i個節點中選取權值最小的兩個節點HT1->Parent=HT2->Parent=p; p->LChild=HT1; p->RChild=HT2; p->weight=HT1->weight+HT2->weight;
//將兩個節點的權值相加存入最后一個節點中 p=p->next; //p指向下一個沒有存儲權值的節點}
}
系統實現–生成Huffman編碼并寫入文件
void HFMCode(HFMTree HT,CodeNode HC[],char str[])
{
//從每個葉子節點開始,利用哈夫曼樹對每個字符進行編碼,最終建立一個哈夫曼表 int i; HFMTree q,p=HT; for(i=0;i<n;i++)
//將字符存入哈夫曼編碼結構體數組的字符單元中 { HC[i].ch=str[i]; HC[i].code[n-1]='\0'; //初始化編碼的最后一位 }
for(i=0;i<n;i++){ HC[i].start=n-1; for(q=p;q->Parent;q=q->Parent)
//判斷q所指向的節點,左孩子置0,右孩子置1 if(q==q->Parent->LChild) HC[i].code[--HC[i].start]='0'; else HC[i].code[--HC[i].start]='1'; p=p->next; //判斷下一個葉子節點 }
}
系統實現–4電文譯碼
void DeCoding(char code[],HFMTree HT,char str[],char s[])
{ //對哈夫曼編碼進行譯碼,放入字符串s中 int i,j,k=0; HFMTree root,p,q; for(root=HT;root->Parent;root=root->Parent); //用root指向哈夫曼樹的根結點for(i=0,p=root;code[i];i++) //從根結點開始按編碼順序訪問樹
{ if(code[i]=='0') p=p->LChild; else p=p->RChild; if(p->LChild==NULL&&p->RChild==NULL) //到根節點時將該節點對應的字符輸出 { for(j=0,q=HT;q!=p;q=q->next,j++); s[k++]=str[j]; p=root; //回溯到根結點 } } s[k]='\0'; //解碼完畢,在字符串最后一個單元存入'\0'
}
參看文獻
參考文獻
[1] 嚴蔚敏.數據結構(C語言版).清華大學出版社,2007
[2] 蘇仕華.數據結構課程設計.機械工業出版社,2007
[3] 譚浩強.C語言程序設計教程.高等教育出版社,2006
總結
以上是生活随笔為你收集整理的可逼近信道容量编码技术之霍夫曼编码的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 原创:大数据专业四大考研方向推荐,4个原
- 下一篇: 红外遥感设计报告论文+电路原理图