哈夫曼树编码解码器文档格式.docx
- 文档编号:6538701
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:21
- 大小:240.48KB
哈夫曼树编码解码器文档格式.docx
《哈夫曼树编码解码器文档格式.docx》由会员分享,可在线阅读,更多相关《哈夫曼树编码解码器文档格式.docx(21页珍藏版)》请在冰点文库上搜索。
将编码字符逆置
由于在生成编码表时,采用自下而上的方式,所以每个字符的编码顺序是反序的,即还需要将编码逆置一下。
方法是采用循环算法,依次将编码中的前后对应的字符逆置。
c.编码:
此算法比较简单,每读出一个字符,只要在编码表中找出对应的编码即可。
2.代码详细分析:
示意图如下:
a=0
a=1
a=2a=3a=4
3.程序运行结果
1.输入及统计结果
2.编码表
3.编码结果
4.译码结果:
4.总结
程序一开始就碰到了一个难题,如何从屏幕上读取字符串并存储,后来在网上查找,发现cin.getline函数就是专门实现这个功能的,于是这个问题便迎刃而解了。
然后,由于本程序统计的东西较多,循环的嵌套也比较多,一开始时总是出现错误,后来慢慢的一个一个得都解决了,主要是细心的问题。
在理论课上感觉对树的概念理解的还算透彻,但是实验时,就发现,仅仅是理论课、教材上那么一点东西是远远不够的,我们需要的还是多实践,增强对C++编程的熟练程度。
还有一点就是,在编程时,很容易忽略机器的思维而代以人的思维,或者,很容易将一些不常见的情况忽略掉,有时候需要抛出异常,有时是需要做各种假设,这都需要在不断地熟悉中培养出来的良好的编程素质,我承认我在这方面做的还很差,以后会更加努力的。
//Huffman.h
#include<
iostream>
string.h>
usingnamespacestd;
structHNode//树º
¡
Â
存ä
?
储ä
é
结¨
¢
构1
structHCode//哈t夫¤
¨
°
曼¨
¹
编À
¤
码?
的Ì
chardata;
charcode[100];
classHuffman
private:
HNode*HTree;
HCode*HCodeTable;
intCn;
public:
voidCreateHtree(inta[],intn);
//创ä
ä
建¡
§
哈t夫¤
树º
voidCreateCodeTable(charb[],intn);
//创ä
表À
ª
voidEncode(char*s,char*d);
//对?
s进?
行D编À
,ê
到Ì
d;
voidDecode(char*s,char*d,intn);
行D解a码?
voidPrintTable(intn,charb[]);
//打ä
印®
~Huffman();
intCodes;
//用®
于®
²
统ª
3计?
转Á
a换?
后¨
®
所¨
´
用®
空?
间?
voidHuffman:
:
CreateHtree(inta[],intn)
HTree=newHNode[2*n-1];
intCn=n;
for(inti=0;
i<
n;
i++)
{
HTree[i].weight=a[i];
HTree[i].LChild=-1;
HTree[i].RChild=-1;
HTree[i].parent=-1;
}
intx=0,y=1;
for(inti=n;
2*n-1;
i++)//找¨
权¨
值¦
Ì
最Á
小?
两¢
个?
字Á
母?
并¡
返¤
¦
回?
他?
们?
位?
置?
x,ê
y
{
for(intj=0;
j<
i;
j++)
{if(x==y)
y++;
if(a[x]<
0)
x++;
if(a[y]<
y++;
if((a[x]>
a[j])&
&
(a[j]>
0))
x=j;
if((a[y]>
0)&
y!
=x)
y=j;
a[i]=a[x]+a[y];
a[x]=-1;
//将?
已°
造¨
¬
为a-1
a[y]=-1;
HTree[x].parent=HTree[y].parent=i;
HTree[i].weight=HTree[x].weight+HTree[y].weight;
HTree[i].LChild=x;
HTree[i].RChild=y;
HTree[i].parent=-1;
}
CreateCodeTable(charb[],intn)
chartemp;
Cn=0;
HCodeTable=newHCode[n];
if(Cn<
n)
Cn=n;
HCodeTable[i].data=b[i];
intchild=i;
intparent=HTree[i].parent;
intk=0;
while(parent!
=-1)
{
if(child==HTree[parent].LChild)
HCodeTable[i].code[k]='
0'
;
else
1'
k++;
child=parent;
parent=HTree[parent].parent;
}
HCodeTable[i].code[k]='
\0'
k--;
//'
不?
进?
行D反¤
a,ê
以°
k-1
for(intj=0;
k;
j++,k--)//将?
反¤
a
temp=HCodeTable[i].code[j];
HCodeTable[i].code[j]=HCodeTable[i].code[k];
HCodeTable[i].code[k]=temp;
PrintTable(intn,charb[])
cout<
<
b[i]<
"
为a"
HCodeTable[i].code<
endl;
Encode(char*s,char*d)
intk=0,l=0,q=0,p=0;
Codes=0;
//统ª
bit树º
while(s[p]!
='
)
k=0;
q=0;
while(HCodeTable[k].data!
=s[p])//找¨
中D字Á
对?
应®
|的Ì
句?
子Á
之?
while(HCodeTable[k].code[q]!
)//将?
写¡
入¨
d
d[l]=HCodeTable[k].code[q];
l++;
q++;
Codes++;
//写¡
1或¨
0,ê
Codes+1,ê
bit
p++;
d[l]='
Decode(char*s,char*d,intn)
intl=0,p=0;
intparent=2*n-2;
while(HTree[parent].LChild!
=-1&
HTree[parent].RChild!
if(s[p]=='
parent=HTree[parent].LChild;
parent=HTree[parent].RChild;
p++;
d[l]=HCodeTable[parent].data;
l++;
Huffman:
~Huffman()
inti=0;
HNode*p=NULL;
HCode*q=NULL;
while(HTree[i].parent=-1)//当Ì
À
parent=-1时º
就¨
是º
根¨
节¨
点Ì
此ä
时º
HTree数º
y组Á
尾2
p=&
HTree[i];
deletep;
i++;
i=0;
q=&
HCodeTable[i];
while(i<
Cn)
q=&
deleteq;
i++;
//Huffman.cpp
conio.h>
#include"
huffman.h"
charStr[1024];
//存ä
输º
符¤
intcount=0;
串ä
有®
D多¨
少¦
intcount2=0;
种?
charCount[1024];
intCounti[1024];
voidGetchar();
中D的Ì
各¡
voidmain()
inta=0;
charPstr1[1024];
charPstr2[1024];
boolflag=0;
//标À
º
记?
否¤
了¢
HuffmanHuff;
while(a!
=48)
1:
2:
ê
o打ä
3:
果?
4:
译°
0:
o退ª
出?
***************************************************************************"
a=_getche();
inti=0;
switch(a)
case49:
cout<
请?
(ê
1024个?
)ê
//if(flag)
//{
//Huff.~Huffman();
//}
try
{
Getchar();
while(i<
count2)
if(Count[i]=='
'
cout<
格?
数º
y为a"
Counti[i]<
'
\t'
else
Count[i]<
i++;
}
共2有®
D"
count2<
flag=1;
Huff.CreateHtree(Counti,count2);
Huff.CreateCodeTable(Count,count2);
catch(char*S)
S<
break;
case50:
if(flag)
Huff.PrintTable(count2,Count);
错ä
误¨
!
先¨
case51:
Huff.Encode(Str,Pstr1);
Pstr1<
前¡
ã
Str;
共2"
Count<
占?
8*"
count<
bit="
8*count<
bit"
占?
bit为a"
Huff.Codes<
压1缩?
比À
8*count/float(Huff.Codes)<
;
case52:
Huff.Decode(Pstr1,Pstr2,count2);
Pstr2<
case48:
exit(0);
voidGetchar()
count=0;
cin.getline(Str,1024);
for(;
Str[count]!
count++)
if(count==1024)throw"
溢°
if(count==0)throw"
重?
新?
intj=0,k=0;
charkey=Str[0];
//
intcount1=0;
while(key!
count1=0;
for(inti=j;
Str[i]!
if(key==Str[i])
++count1;
j++;
//Str[]的Ì
序¨
号?
Count[k]=key;
Counti[k]=count1;
//Count[],Counti[]的Ì
for(inti=0;
i++)//比À
较?
Count[]中D是º
经-存ä
DStr[j]
if(Str[j]==Count[i])
{
j++;
i=0;
}
key=Str[j];
//找¨
Count[]中D没?
DStr[j]这a个?
Count[k]='
count2=k;
//储ä
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼树 编码 解码器
![提示](https://static.bingdoc.com/images/bang_tan.gif)