第十周 项目一(4)哈夫曼编码的算法验证
生活随笔
收集整理的這篇文章主要介紹了
第十周 项目一(4)哈夫曼编码的算法验证
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/*
Copyright (c)2017,煙臺(tái)大學(xué)計(jì)算機(jī)與控制工程學(xué)院
All rights reserved.
文件名稱:第十一周項(xiàng)目1 - 哈夫曼編碼算法驗(yàn)證.cpp
作 者:孫仁圓
完成日期:2017年12月29日
版 本 號(hào):v1.0 問題描述: 運(yùn)行并重復(fù)測試教學(xué)內(nèi)容中涉及的算法。改變測試數(shù)據(jù)進(jìn)行重復(fù)測試的意義在于, 可以從更多角度體會(huì)算法,以達(dá)到逐漸掌握算法的程度。 使用你的測試數(shù)據(jù),并展示測試結(jié)果,觀察運(yùn)行結(jié)果,以此來領(lǐng)會(huì)算法。
輸入描述: 若干測試數(shù)據(jù)。
程序輸出: 對(duì)應(yīng)數(shù)據(jù)的輸出。
*/ #include <stdio.h>
#include <string.h>
#define N 50 //葉子節(jié)點(diǎn)數(shù)
#define M 2*N-1 //樹中節(jié)點(diǎn)總數(shù) //哈夫曼樹的節(jié)點(diǎn)結(jié)構(gòu)類型 typedef struct
{ char data; //節(jié)點(diǎn)值 double weight; //權(quán)重 int parent; //雙親結(jié)點(diǎn) int lchild; //左孩子結(jié)點(diǎn) int rchild; //右孩子節(jié)點(diǎn)
}HTNode; //每個(gè)節(jié)點(diǎn)哈夫曼編碼的結(jié)構(gòu)類型 typedef struct
{ char cd[N]; //存放哈夫曼碼 int start;
} HCode; //構(gòu)造哈夫曼樹
void CreateHT(HTNode ht[],int n)
{ int i,k,lnode,rnode; double min1,min2; for (i=0; i<2*n-1; i++) //所有結(jié)點(diǎn)的相關(guān)域置初值-1 ht[i].parent=ht[i].lchild=ht[i].rchild=-1; for (i=n; i<2*n-1; i++) //構(gòu)造哈夫曼樹 { min1=min2=32767; //lnode和rnode為最小權(quán)重的兩個(gè)結(jié)點(diǎn)位置 lnode=rnode=-1; for (k=0; k<=i-1; k++) if (ht[k].parent==-1) //只在尚未構(gòu)造二叉樹的結(jié)點(diǎn)中查找 { if (ht[k].weight<min1) { min2=min1; rnode=lnode; min1=ht[k].weight; lnode=k; } else if (ht[k].weight<min2) { min2=ht[k].weight; rnode=k; } } ht[i].weight=ht[lnode].weight+ht[rnode].weight; ht[i].lchild=lnode; ht[i].rchild=rnode; ht[lnode].parent=i; ht[rnode].parent=i; }
} //實(shí)現(xiàn)哈夫曼編碼
void CreateHCode(HTNode ht[],HCode hcd[],int n)
{ int i,f,c; HCode hc; for (i=0; i<n; i++) //根據(jù)哈夫曼樹求哈夫曼編碼 { hc.start=n; c=i; f=ht[i].parent; while (f!=-1) //循序直到樹根結(jié)點(diǎn) { if (ht[f].lchild==c) //處理左孩子結(jié)點(diǎn) hc.cd[hc.start--]='0'; else //處理右孩子結(jié)點(diǎn) hc.cd[hc.start--]='1'; c=f; f=ht[f].parent; } hc.start++; //start指向哈夫曼編碼最開始字符 hcd[i]=hc; }
} //輸出哈夫曼編碼
void DispHCode(HTNode ht[],HCode hcd[],int n)
{ int i,k; double sum=0,m=0; int j; printf(" 輸出哈夫曼編碼:\n"); //輸出哈夫曼編碼 for (i=0; i<n; i++) { j=0; printf(" %c:\t",ht[i].data); for (k=hcd[i].start; k<=n; k++) { printf("%c",hcd[i].cd[k]); j++; } m+=ht[i].weight; sum+=ht[i].weight*j; printf("\n"); } printf("\n 平均長度=%g\n",1.0*sum/m);
} int main()
{ int n=8,i; //n表示初始字符串的個(gè)數(shù) char str[]= {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}; double fnum[]= {0.07,0.19,0.02,0.06,0.32,0.03,0.21,0.1}; HTNode ht[M]; HCode hcd[N]; for (i=0; i<n; i++) { ht[i].data=str[i]; ht[i].weight=fnum[i]; } printf("\n"); CreateHT(ht,n); CreateHCode(ht,hcd,n); DispHCode(ht,hcd,n); printf("\n"); return 0;
}
總結(jié)
以上是生活随笔為你收集整理的第十周 项目一(4)哈夫曼编码的算法验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文笔记目录(ver2.0)
- 下一篇: dbeaver sql字体异常