- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对文本文档的Huffman编码解码,附详细程序
Shannon.txt是要求编码的文档
首先,是要在command window里面键入“fid=fopen(Shannon.txt,r);回车data=fread(fid);回车data”这是将文档读入,并且以ASCII码的形式显示出来。
第一步,运行“统计1”文件,用来统计文档中各个字符出现的个数
第二步,运行“数量2”文件,用来计算字符的总个数,总共是70个。
第三步,运行“求和3”文件,用来统计文本里面所有字符出现的次数,并且计算每个字符出现的概率。
第四步,运行“顺序排列4”文件,将每个字符出现的概率进行从大到小的顺序排序,然后将其放到M矩阵的第一行。
第五步,运行“计算5”文件,用来进行huffman编码的计算,具体算法如下:
该矩阵定义为M矩阵,M矩阵的第一行,存放的是需要编码的各个字符出现的概率,并且按照从大到小排列顺序,然后再将第一行最后两个数相加(即概率最小的两个数相加),
把相加得到的结果放到第二行,然后再将第二行重新进行排序,依此类推,一直到第69行,这时第69行只有两个概率,并且相加肯定为1 .
第六步,运行“编码6”文件,用来对M矩阵的数值进行huffman编码,具体编码过程如下:
首先建立N矩阵,用来存放编码的码字,N=69*(70*70),总共69行,4990列,因为每一个码字的编码长度不会超过70,把4990列看成70个小段,每个小段可以存放70个字符。
然后将字符0,赋给最后一行的第一小段,再将字符1,赋给最有一行的第二小段,在M矩阵中,由于每一行的最后两个数,都是这一行中概率最小的两个数,所以将倒数第二行的最后两个数
进行相加,然后用相加的结果到倒数第一行中去寻找,肯定会在倒数第一行中找到一样的值,然后记录下来在倒数第一行中这个值的位置,再将这个在M矩阵中的位置对应到N矩阵中,
将N矩阵中的该位置的字符赋给倒数第二行的第二小段和第三小段,最后在给第二小段的后面赋字符0,给第三小段后面赋字符1,然后将在最后一行找到的那个数的左边的数,一一对应到
上一行去,右边的数,向左串一位,再对应到上一行去,这样依此类推,那么在N矩阵的第一行,可以得到最后的编码。
第七部,运行“首行编码7”,输出第一行的所有编码,即为对应字符的huffman编码。
clc;
clear all;
%将文档读入,并且以ASCII码的形式显示出来
fid=fopen(Shannon.txt,r);
data=fread(fid);
data
%统计文档中各个字符出现的个数
i=1;a=0;M=0:1:113;
for ii=10:122
a=0;
i=1;
while i4991
if data(i,1)==ii
a=a+1;
end
i=i+1;
end
j=ii-9;
M(1,j)=a;
fprintf(M=%d, ,M(1,j));
end
%计算字符的总个数,总共是70个
i=1;j=1;N=0:1:100;
while i114
if M(1,i)~=0
N(1,j)=M(1,i);
fprintf(N=%d ,N(1,j));
j=j+1;
end
i=i+1;
end
fprintf(\n);
fprintf(num=%d,j-1);
%统计文本里面所有字符出现的次数,并且计算每个字符出现的概率
i=1;j=1;n=1;sum1=0;p=1:1:70;
while i71
sum1=sum1+N(1,j);
p(1,i)=(N(1,j)/4990);
n=n+1;
fprintf(p=%f ,p(1,i));
i=i+1;
j=j+1;
end
fprintf(\n);
fprintf(sum1=%d\n,sum1);
%将每个字符出现的概率进行从大到小的顺序排序,然后将其放到M矩阵的第一行
i=1;j=2;
while i71
j=i+1;
while j71
if p(1,i)p(1,j)
temp=p(1,i);
p(1,i)=p(1,j);
p(1,j)=temp;
end
j=j+1;
end
fprintf(p=%f ,p(1,i));
i=i+1;
end
M=
文档评论(0)