无损压缩编码实验Word格式文档下载.docx
《无损压缩编码实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《无损压缩编码实验Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
{
unsignedinttemp1=0;
unsignedinttemp2=0;
unsignedinttemp3;
for(inti=1;
i<
=Count;
i++)
{
if(HT[i].Parent==0)
{
if(temp1==0)
{
temp1=HT[i].Weight;
(*s1)=i;
}
else
{if(temp2==0)
{temp2=HT[i].Weight;
(*s2)=i;
if(temp2<
temp1)
{
temp3=temp2;
temp2=temp1;
temp1=temp3;
temp3=(*s2);
(*s2)=(*s1);
(*s1)=temp3;
}
}
{
if(HT[i].Weight<
temp1=HT[i].Weight;
(*s2)=(*s1);
(*s1)=i;
if(HT[i].Weight>
temp1&
&
HT[i].Weight<
temp2)
temp2=HT[i].Weight;
(*s2)=i;
}
voidHuffmanCoding(HuffmanTree*HT,HuffmanCode*HC,int*Weight,intCount)//霍夫曼编码函数
inti;
ints1,s2;
intTotalLength;
char*cd;
unsignedintc;
unsignedintf;
intstart;
if(Count<
=1)return;
TotalLength=Count*2-1;
HT=newHuffmanTree[(TotalLength+1)*sizeof(HuffmanTree)];
for(i=1;
HT[i].Parent=0;
//父节点
HT[i].rChild=0;
//左孩子
HT[i].lChild=0;
//右孩子
HT[i].Weight=(*Weight);
Weight++;
for(i=Count+1;
=TotalLength;
HT[i].Weight=0;
HT[i].Parent=0;
HT[i].lChild=0;
HT[i].rChild=0;
//建造霍夫曼树
++i)
Select(HT,i-1,&
s1,&
s2);
HT[s1].Parent=i;
HT[s2].Parent=i;
HT[i].lChild=s1;
HT[i].rChild=s2;
HT[i].Weight=HT[s1].Weight+HT[s2].Weight;
//输出霍夫曼编码
(*HC)=(HuffmanCode)malloc((Count+1)*sizeof(char*));
cd=newchar[Count*sizeof(char)];
cd[Count-1]='
\0'
;
start=Count-1;
for(c=i,f=HT[i].Parent;
f!
=0;
c=f,f=HT[f].Parent)
if(HT[f].lChild==c)
cd[--start]='
0'
1'
(*HC)[i]=newchar[(Count-start)*sizeof(char)];
strcpy((*HC)[i],&
cd[start]);
}
delete[]HT;
delete[]cd;
intLookFor(char*str,charletter,intcount)//在字符串中查找某个字符,如果找到,则返回其位置
{inti;
for(i=0;
count;
if(str[i]==letter)returni;
return-1;
voidQuanzhi(char*Data,intLength,char**WhatLetter,int**Weight,int*Count)//计算权值并输出
char*Letter=newchar[Length];
int*LetterCount=newint[Length];
intAllCount=0;
intIndex;
intSum=0;
floatPersent=0;
Length;
if(i==0)
Letter[0]=Data[i];
LetterCount[0]=1;
AllCount++;
Index=LookFor(Letter,Data[i],AllCount);
if(Index==-1)
Letter[AllCount]=Data[i];
LetterCount[AllCount]=1;
}
else
{LetterCount[Index]++;
}
AllCount;
i++)//计算平均码长
Sum=Sum+LetterCount[i];
(*Weight)=newint[AllCount];
(*WhatLetter)=newchar[AllCount];
Persent=(float)LetterCount[i]/(float)Sum;
(*Weight)[i]=(int)(100*Persent);
(*WhatLetter)[i]=Letter[i];
(*Count)=AllCount;
delete[]Letter;
delete[]LetterCount;
intmain()//主函数调用
HuffmanTree*HT=NULL;
HuffmanCodeHC;
charData[100];
//储存输入的字符串
char*Letter;
int*Weight;
intCount;
cout<
<
"
**********欢迎使用霍夫曼编码器********"
endl;
请输入一行字符串:
cin>
>
Data;
Quanzhi(Data,strlen(Data),&
Letter,&
Weight,&
Count);
HuffmanCoding(HT,&
HC,Weight,Count);
字符出现频率和编码结果"
doubleK=0;
doubleL;
charP[100];
for(inti=0;
i<
Count;
i++)
Letter[i]<
"
//字符
Weight[i]<
%\t"
//出现频率
HC[i+1]<
//霍夫曼码
strcpy(P,HC[i+1]);
L=strlen(P);
K=K+L*Weight[i]/100;
平均码长"
K;
system("
pause"
);
return0;
六,测试结果
输入字符串“jjjdddeielsl”
七,实验总结
通过本次实验,尤其在自己对程序的调试过程中,感觉对树的存储结构,终结状态,还有编码,译码的过程都有了比较清晰的认识。
对于霍夫曼的编码算法过程有了更深的理解,对霍夫曼树的构造,二叉树的遍历更加熟悉。
实验过程出现了一些问题,通过查阅资料,最终顺利解决