哈夫曼编码算法课程设计Word文档格式.docx
- 文档编号:22560813
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:13
- 大小:79.14KB
哈夫曼编码算法课程设计Word文档格式.docx
《哈夫曼编码算法课程设计Word文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼编码算法课程设计Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
ˉsinterests.ThefilehadbeencompressedusingHuffman,thepartofthefilethatDanhasshowsonlytheHuffmancodesthemselves,notthecompressedinformation.SinceHuffmancodesarebasedonthefrequenciesofthecharactersintheoriginalmessage,Dan!
ˉsbossthinksthatsomeinformationmightbeobtainedifDancanreversetheHuffmanencodingprocessandobtainthecharacterfrequenciesfromtheHuffmancodes.Dan!
ˉsgutreactiontothisisthatanygivensetofcodescouldbeobtainedfromawidevarietyoffrequencydistributions,buthisbossisnotimpressedwiththisreasonedanalysis.SoDanhascometoyoutogetmoredefinitiveprooftotakebacktohisboss.
Huffmanencodingisanoptimaldatacompressionmethodifyouknowinadvancetherelativefrequenciesoflettersinthetexttobecompressed.ThemethodworksbyfirstconstructingaHuffmantreeasfollows.Startwithaforestoftrees,eachtreeasinglenodecontainingacharacterfromthetextanditsfrequency(thecharactervalueisusedonlyintheleavesoftheresultingtree).Eachstepoftheconstructionalgorithmtakesthetwotreeswiththelowestfrequencyvalues(choosingarbitrarilyifthereareties),andreplacesthemwithanewtreeformedbyjoiningthetwotreesastheleftandrightsubtreesofanewrootnode.Thefrequencyvalueofthenewrootisthesumofthefrequenciesofthetwosubtrees.Thisprocedurerepeatsuntilonlyonetreeisleft.Anexampleofthisisshownbelow,assumingwehaveafilewithonly5characters¨
CA,B,C,DandE¨
Cwithfrequencies10%,14%,31%,25%and20%,respectively.
AfteryouhaveconstructedaHuffmantree,assigntheHuffmancodestothecharactersasfollows.Labeleachleftbranchofthetreewitha0andeachrightbranchwitha1.ReadingdownfromtheroottoeachcharactergivestheHuffmancodeforthatcharacter.ThetreeaboveresultsinthefollowingHuffmancodes:
A-010,B-011,C-11,D-10andE-00.
Forthepurposeofthisproblem,thetreewiththelowerfrequencyalwaysbecomestheleftsubtreeofthenewtree.Ifbothtreeshavethesamefrequencies,eitherofthetwotreescanbechosenastheleftsubtree.Notethatthismeansthatforsomefrequencydistributions,thereareseveralvalidHuffmanencodings.
ThesameHuffmanencodingcanbeobtainedfromseveraldifferentfrequencydistributions:
change14%to13%and31%to32%,andyoustillgetthesametreeandthusthesamecodes.DanwantsyoutowriteaprogramtodeterminethetotalnumberofdistinctwaysyoucouldgetagivenHuffmanencoding,assumingthatallpercentagesarepositiveintegers.Notethattwofrequencydistributionsthatdifferonlyintheorderingoftheirpercentages(forexample30%70%foronedistributionand70%30%foranother)arenotdistinct.
Input
Theinputconsistsofseveraltestcases.Eachtestcaseconsistsofasinglelinestartingwithapositiveintegern(2n20),whichisthenumberofdifferentcharactersinthecompresseddocument,followedbynbinarystringsgivingtheHuffmanencodingofeachcharacter.YoumayassumethatthesestringsareindeedaHuffmanencodingofsomefrequencydistribution(thoughunderouradditionalassumptions,itmaystillbethecasethattheansweris0¨
Cseethelastsamplecasebelow).
Thelasttestcaseisfollowedbyalinecontainingasinglezero.
Output
Foreachtestcase,printalinecontainingthetestcasenumber(beginningwith1)followedbythenumberofdistinctfrequencydistributionsthatcouldresultinthegivenHuffmancodes.
DanMcAmbi是一个发间谍组织的成员,最近他取得了一个包括着关于他的国家利益的相当重要信息的文件的部份内容。
这份文件已经被用赫夫曼编码紧缩。
不幸的是,Dan拥有的部份文件是用赫夫曼编码本身显示的,而不是紧缩文件。
由于赫夫曼编码是基于原始信息中代码的频率而编写的,Dan的老板以为若是Dan能够倒转赫夫曼编码的程序而且取得赫夫曼编码中代码的频率,那么就能够够取得一些信息。
Dan对这一信息的本能反映确实是所有给定的编码能够从普遍的多样的频率散布中取得,可是他的老板并非为这一合理的分析所吸引。
因此Dan想请你帮忙,希望你能够取得更多决定性的证明,让他带回给他的老板。
若是你提早明白被紧缩文件中字母的相对概率,那么赫夫曼编码确实是一种很理想的文件紧缩方式。
这种方式第一通过构造一些赫夫曼树来展动工作。
以丛林的树为开始,以丛林的树为开始,每棵树的每一个单节点都包括了一个文件中的符号和它的频率(元素的价值只被用在最终树的叶子节点中)构造该算法的每一步确实是取两棵最低频率价值的树(若是两棵树的概率相同,那么任意选取),然后用一棵由这两棵树别离作为左右子树的和新的根节点的树来代替它们。
新的根的频率是两棵子树价值频率总和。
重复的进行这一步骤直到只剩下一棵树为止。
下面是一个例子,假设咱们有一个包括五个元素的文件A、B、C、D、E和它们别离的概率是10%,14%,31%,25%和20%。
在你构造好赫夫曼树以后,给下面的元素分派赫夫曼编码。
用0来标注树的左分支,用1来标注树的右分支。
从树的根来读起,一直到每一个分支元素,给出它们的赫夫曼编码。
上面的树的结果如下:
A-010,B-011,C-11,D-10和E-00.
这一问题的目的,低频率的树老是变成新树的左子树。
若是两棵树有相同的频率,那么哪棵都能够被选为左子树。
注意到前面几种概率散布,有几种有依照的赫夫曼编码。
相同的赫夫曼编码能够从不同的频率散布中取得:
转变范围在14%到13%和31%到32%,你也能够从相同的树中取得相同的编码。
Dan希望你能够写一个程序,用它来计算不同途径取得的给定赫夫曼编码的总数,即在哈夫曼树的形态确信的情形下,求出字符集所有可能的频率散布的数量,要求频率百分数的分子必需是整数。
假设所有的百分比都是确信的正整数。
注意到两个不同顺序的相同概率也是不一样的散布(例如30%70%和70%30%是不同的)。
输入:
输入一个测试数据的组合。
每一个测试包括一个由正整数n开始的一组数,这些整数n是被紧缩文件中不同的元素,还有它们的给定的赫夫曼编码的二元字符串。
你能够假设这些字符确实是一些概率散布的赫夫曼编码(尽管在咱们的附加假设之下,仍然会有结果是0的情形,下面的一个简单例子中有此情形)。
最后一个测试结果包括了一个0.
输出:
关于每一个测试,输出一组包括测试数字(以1为开始的)和求出字符集所有可能的频率散布的数量,要求频率百分数的分子必需是整数。
二、问题分析:
1.哈夫曼树是一种利用前缀编码进行数据紧缩的方式,构造方式是每次选取频率最小的两个字符将其归并。
2.哈夫曼树构造时每次参与归并的数不小于任意一个先前参与归并的数。
3.哈夫曼树构造时每次归并产生的数大小不减。
三、概要设计:
存储结构:
哈夫曼树的结点存储结构为双亲小孩存储结构,并包括一个权值域和标志域flag。
双亲小孩存储结构采纳仿真指针实现;
flag=0时表示该结点尚未加入到哈夫曼树中,flag=1时表示该结点已加入到哈夫曼树中。
哈夫曼树的结点存储结构:
weightflagparentleftChildrightChild
哈夫曼编码的存储结构概念成一个包括寄存0和1序列的数组、编码的起始下标和字符权值的存储结构。
寄存哈夫曼编码的数组元素结构为:
MaxN
…Bit[start]Bit[0]Bit[1]…Bit[MaxBit-1]
寄存哈夫曼编码
四、详细设计:
哈夫曼树的构造算法:
(1)由给定的n个权值{w1,w2,…,wn}构造n棵只有根结点的二叉树,从而取得一个二叉树丛林F={T1,T2,…,Tn}。
(2)在二叉树丛林F当选取根结点的权值最小和次小的两棵二叉树作为新的二叉树的左右子树构造新的二叉树,新的二叉树的根结点权值为左右子树根结点权值之和。
(3)在二叉树丛林F中删除作为新二叉树左右子树的两棵二叉树,将新二叉树加入到二叉树丛林F中。
(4)重复步骤
(2)和(3),当二叉树丛林F中只剩下一棵二叉树时,这棵二叉树确实是所构造的哈夫曼树。
哈夫曼编码的构造算法:
定义一个存放中间结果的数组
由一个叶结点向上遍历直到根结点,过程中若当前结点为其双亲结点的左孩子则得到分支编码0,否则得到1;
得到的第一个分支编码放入数组的最后一位,依次往前存放得到的分支编码
保存一个叶结点的编码、不等长编码的起始位start和相应字符的权值
得到n个结点的哈夫曼编码数组
主函数算法:
输入将要编码的字符个数和各字符的权值
构造哈夫曼树
构造哈夫曼编码
输出每个叶结点的哈夫曼编码
五、调试分析:
一、哈夫曼树的构造进程:
二、哈夫曼树的结点选择进程:
3、调试结果如下:
六、结果分析:
一、各模块算法的时刻复杂度:
哈夫曼树的构造函数:
O(n2)
哈夫曼编码的构造函数:
二、测试结果如下:
七、设计心得体会:
通过本次实验让咱们深刻了解了哈夫曼编码中哈夫曼树的构造进程,并学会了更多关于C++的应用知识。
另外,通过这次课程设计,咱们收成匪浅,第一由衷感激教师提供如此一个锻炼自己的机遇,感受到学来的知识不只是用来完成试卷的。
一贯惯于独立试探的自己学会了踊跃的同同窗、朋友交流,扬长避短,一起进步。
课程设计使自己发觉考试并非是最重要,最重要的是能运用所学的知识。
在整个课程设计的学习进程中,再也不是用学到的知识解题,而是在实际运历时碰到什么学什么,重在把知识应用于实际。
八、参考文献:
[1]许薇,《面向对象的程序设计(C++描述)》,清华大学出版社,2020年。
[2],,《数据结构(C语言版)》,清华大学出版社,2020年。
[3]王晓东,《算法设计与分析(第2版)》,清华大学出版社,2020年。
九、附录(源代码):
i]当选择parent为0且weight最小的两个结点,
arent==0)
{
s1=k;
break;
}
for(k=1;
k<
=i;
k++)
if(HT[k].parent==0)
if(HT[s1].weight>
HT[k].weight)
if(HT[k].parent==0&
&
k!
=s1)
s2=k;
if(HT[s2].weight>
}
voidHuffmanCoding(HuffmanTree&
HT,HuffmanCode&
HC,int*w,intn)
{eight=w[i-1];
HT[i].parent=0;
HT[i].lchild=0;
HT[i].rchild=0;
HT[i].flag=0;
for(i=n+1;
i<
=m;
i++)eight=0;
eight,HT[i].flag,HT[i].parent,HT[i].lchild,HT[i].rchild);
*/
i++){lag=1;
HT[s1].parent=i;
HT[s2].parent=i;
HT[s1].flag=HT[s2].flag=1;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
eight,HT[j].flag,HT[j].parent,HT[j].lchild,HT[j].rchild);
cout<
<
endl;
arent;
f!
=0;
c=f,f=HT[f].parent)child==c)
cd[--start]='
0'
;
else
1'
HC[i]=(char*)malloc((n-start)*sizeof(char));
//为第i个字符编码分派空间
strcpy(HC[i],&
cd[start]);
//从cd复制编码(串)到HC
free(cd);
//释放工作空间
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
voidmain()
{
HuffmanTreeA;
HuffmanCodea;
intn,i;
int*w;
charch='
A'
"
请输入您要编码的字符个数(按ENTER确认):
cin>
>
n;
请别离输入这"
n<
个编码的权值(按ENTER确认):
w=(int*)malloc(n*sizeof(int));
for(i=0;
i<
i++)
ch<
:
w[i];
ch++;
HuffmanCoding(A,a,w,n);
ch='
您要求的"
个结点的赫夫曼编码别离为:
for(i=1;
=n;
printf("
%c<
%2d>
"
ch,w[i-1]);
a[i]<
free(w);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼 编码 算法 课程设计