无损压缩编码实验Word格式文档下载.docx

上传人:b****6 文档编号:19164327 上传时间:2023-01-04 格式:DOCX 页数:9 大小:66.24KB
下载 相关 举报
无损压缩编码实验Word格式文档下载.docx_第1页
第1页 / 共9页
无损压缩编码实验Word格式文档下载.docx_第2页
第2页 / 共9页
无损压缩编码实验Word格式文档下载.docx_第3页
第3页 / 共9页
无损压缩编码实验Word格式文档下载.docx_第4页
第4页 / 共9页
无损压缩编码实验Word格式文档下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

无损压缩编码实验Word格式文档下载.docx

《无损压缩编码实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《无损压缩编码实验Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。

无损压缩编码实验Word格式文档下载.docx

{

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”

七,实验总结

通过本次实验,尤其在自己对程序的调试过程中,感觉对树的存储结构,终结状态,还有编码,译码的过程都有了比较清晰的认识。

对于霍夫曼的编码算法过程有了更深的理解,对霍夫曼树的构造,二叉树的遍历更加熟悉。

实验过程出现了一些问题,通过查阅资料,最终顺利解决

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1