统计信源熵与哈夫曼编码Word格式文档下载.docx
- 文档编号:18165047
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:20
- 大小:174.92KB
统计信源熵与哈夫曼编码Word格式文档下载.docx
《统计信源熵与哈夫曼编码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《统计信源熵与哈夫曼编码Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
p(x1)≥p(x2)≥…≥p(xn)
(2)取两个概率最小的符号分别配以0和1,并将这两个概率相加作为一个新符号的概率,与未分配码元的符号重新排队。
(3)对重排后的两个概率最小符号重复步骤2的过程。
(4)继续上述过程,直到最后两个符号配以0和1为止。
(5)从最后一级开始,向前返回得到各个信源符号所对应的码元序列,即相应的码字。
2.3具体设计思路
在VC++环境中进行编程
(1)运行程序,在对话框里输入一段英文,将26个英文字母及空格作为信源。
(2)计算每个字母出现的次数(不区分大小写),再通过计算信源总大小来计算在本篇文章中每个字母出现的概率。
(3)通过信源熵计算公式来计算信源熵。
(2)哈夫曼编码
(1)输入概率矩阵,并检验是否正确,即各概率不能小于零,总概率之和等于一。
(2)建立各概率符号的位置索引矩阵Index,利于编码后从树根进行回溯,从而得出对应的编码
(3)输出所需的哈弗曼编码。
(4)计算信源熵,并计算平均码长,算出编码效率。
(5)输出结果。
三、设计流程图
3.1统计信源熵的设计思路
3.2哈夫曼编码设计思路
四、程序运行及结果
4.1统计信源熵程序运行结果
运行程序并输入:
Themostdistantwayintheworld
isnotthewayfrombirthtotheend.
itiswhenisitnearyou
thatyoudon'
tunderstandiloveu.
isnotthatyou'
renotsureiloveu.
Itiswhenmyloveisbewilderingthesoul
butican'
tspeakitout.
T测试目的:
检验程序是否正确。
检验方法:
用验证法来检验;
看中概率是否为一,并检测信源熵是否正确。
检验结果:
程序运行结果正确。
如下为运行结果截屏
4.2哈夫曼编码程序运行结果
测试输入:
0.200.190.180.170.150.100.01
测试目的:
测试经常出现的信源符号是否对应较短的码长,检测程序运行结果是否正确。
正确输出:
101100000101001100111
信源熵为-2.60868bit/符号
平均码长为2.72码元/符号
传送速率为0.959075bit/码元
实际输出:
与争取而输出一样
检测结果:
程序无错误
以下为运行结果截屏
五、心得体会
刚开始课程设计的时候,自己是毫无头绪的,不知道从哪里下手,最重要的原因是对C语言没有达到熟练的程度,自己不是很自信。
但是万事开头难,什么困难只要踏出第一步,接下来就会一步步化解。
为了更加熟练地用C语言程序进行编写,我与同组成员仔细地复习以前学过的书籍,经过一段时间后对语法的掌握更加地熟练。
但是实际上在编写的时候,手打难免会碰到各类的问题,例如忘记在语句后面打“;
”等一系列的小问题,所以自能耐心。
对求概率,信源熵,哈夫曼编码的等公式有深入了解后,再构造一个程序的大体框架,再对各个语句的功能进行编写,一步步地完成。
运行错误的话要慢慢检查,特别是一些小细节,直到程序完美运行。
尽管在完成设计过程中遇到了很多困难,但是通过自己和同组同学的努力最后还是完成了,不仅对信息论这门课的内容有了更加深入的了解,更增长了自己动手编程的能力。
其中我最大的感悟是,学习一门课,要把它学好不仅仅是学懂书上的知识点,书本之外的知识也要掌握,这不是在课堂上就能学会的,要靠自己在课后慢慢地积累。
身为大学生的我们把太多时间花在宿舍看电影和玩游戏上面,以至于荒废了太多的时间。
对于身处大三的我们来说,剩下的时间尤为重要,若不考研,明年就该找工作了,那时自己身上没一点技能怎能在社会立足。
所以我认为现在能做的最近本的就是把本专业的主要内容精髓学好,然后在这个基础上学习一些其他必备的技能。
人的一生就是在不断学习中度过,停止学习就等于与社会隔离,作为大学生就是应该与时俱进奋发图强。
以上就是我对这次课程设计真正的感悟。
参考文献
1曹雪虹、张宗橙编著《《信息论与编码》》.清华大学出版社,2009年第2版
2贾宗璞、许合利编著《《C语言程序设计》》.人民邮电出版社,2010年第1版
3严蔚敏、吴伟民编著《《数据结构(C语言版)》》.清华大学出版社,1997年第1版
附页,源程序;
一.统计信源熵
#include<
stdio.h>
math.h>
voidmain()
{doubleresult=0;
intk=0,a=0,num[26]={0};
doublep[26]={0};
intj;
charch;
while((ch=getchar())!
='
\n'
)
{
if(ch>
='
a'
&
&
ch<
z'
||ch>
A'
Z'
{
if(ch<
97)
j=ch-65;
else
j=ch-97;
num[j]++;
k++;
}
}
printf("
各字母出现的次数:
\n"
);
for(inti=0;
i<
26;
i++)
printf("
%c:
%d\t"
'
+i,num[i]);
\n字母个数:
%d\n"
k);
各字母出现的概率:
for(i=0;
%f\t"
+i,(double)num[i]/k);
p[a]=(double)num[i]/k;
a++;
/*******求信源熵*******/
for(a=0;
a<
a++)
{if(p[a]!
=0)
result=result+p[a]*log(p[a])/log
(2);
result=-result;
信源熵为:
%f"
result);
}
}二、哈夫曼编码程序
/**
file:
hoffmancoder.c
date:
2015.03.24
describe:
霍夫曼编解码(仅有霍夫曼码元的生成部分)
*/
stdlib.h>
float.h>
#defineMAX_MESSAGE1024
#defineMAX_MESSAGE_BITS64
#defineDEFAULT_FILE"
probability.txt"
structmessage_info
{
inta_i;
/*消息符号,a1,a2,a3....,值为唯一的*/
doubleprobability;
/*消息符号对应的概率*/
intfather;
/*父节点,用a_i表示*/
intleft;
/*左子节点,用a_i表示*/
intright;
/*子右节点,用a_i表示*/
charcode[MAX_MESSAGE_BITS];
/*编码后的hoffman码值存放在此处*/
};
/*从文件中读取消息符号概率并存储于structmessage_info*message_info中*/
inthoffman_read_from_file(FILE*fp,structmessage_info*message_info);
/*简单的冒泡排序,适用于消息种数较少的情况,(n<
10000)*/
intbubble_sort(structmessage_info**p_message_info,intnum);
/*合并最低的两个符号,并使总符号数减少1,以被合并的符号将不再参与合并*/
inthoffman_combine(structmessage_info**p_message_info,intmessage_info_num,int*message_info_pos);
/*生成hoffman码*/
inthoffman_create_code(structmessage_info*message_info,intmessage_info_num);
intmain()
inti,j;
FILE*fp;
structmessage_infomessage_info[MAX_MESSAGE];
structmessage_info*p_message_info[MAX_MESSAGE];
structmessage_info*find;
intmessage_info_num,message_info_pos;
doubleentropy,encoded_efficiency,average_code_length;
/*信源熵,编码效率和平均编码长度*/
if((fp=fopen(DEFAULT_FILE,"
r"
))==NULL)
return-1;
else{
message_info_num=hoffman_read_from_file(fp,message_info);
average_code_length=encoded_efficiency=entropy=0.0;
for(j=0;
j<
message_info_num;
j++){
entropy+=message_info[j].probability*log10(message_info[j].probability)/log10
(2);
MAX_MESSAGE;
p_message_info[j]=&
message_info[j];
message_info_pos=message_info_num;
message_info_num-1;
hoffman_combine(p_message_info,message_info_num,&
message_info_pos);
bubble_sort(p_message_info,message_info_num+j+1);
for(i=0;
message_info_num-1-j;
i++)
a_i=%2d,p=%g\n"
i,p_message_info[i]->
probability);
----------------------------------\n"
hoffman_create_code(message_info,message_info_num);
\n\ninformation:
2*message_info_num-1;
j++)
a_i=%2d,p=%4.3g,left=%2d,right=%2d,father=%2d,hoffman_code:
%s\n"
message_info[j].a_i,message_info[j].probability,message_info[j].left,message_info[j].right,message_info[j].father,message_info[j].code);
average_code_length+=message_info[j].probability*strlen(message_info[j].code);
\n\n##信源熵为%g\n##平均编码长度为%g\n##编码效率为%g\n\n"
-entropy,average_code_length,-entropy/average_code_length);
system("
pause"
inthoffman_read_from_file(FILE*fp,structmessage_info*message_info)
intcount,message_info_pos;
message_info_pos=0;
while((count=fscanf(fp,"
%lf"
&
(message_info[message_info_pos].probability)))>
0){
message_info[message_info_pos].a_i=message_info_pos;
/*a_i从0开始*/
message_info_pos++;
returnmessage_info_pos;
intbubble_sort(structmessage_info**p_message_info,intnum)
structmessage_info*temp;
num-1;
i++)
for(j=i+1;
num;
if(p_message_info[i]->
probability<
p_message_info[j]->
probability){
temp=p_message_info[i];
p_message_info[i]=p_message_info[j];
p_message_info[j]=temp;
return0;
/*合并最低的两个符号,并使总符号数减少1*/
inthoffman_combine(structmessage_info**p_message_info,intmessage_info_num,int*message_info_pos)
{
/*从大到小排序*/
bubble_sort(p_message_info,message_info_num*2-*message_info_pos);
p_message_info[message_info_num*2-*message_info_pos]->
a_i=-(message_info_num-*message_info_pos+1);
code[0]='
\0'
;
probability=
p_message_info[*message_info_pos-1]->
probability+p_message_info[*message_info_pos-2]->
probability;
left=p_message_info[*message_info_pos-1]->
a_i;
right=p_message_info[*message_info_pos-2]->
father=p_message_info[message_info_num*2-*message_info_pos]->
p_message_info[*message_info_pos-2]->
(*message_info_pos)--;
inthoffman_create_code(structmessage_info*message_info,intmessage_info_num)
inti,j,code_num;
structmessage_info*find,*find_father,*find_now;
i++){
code_num=0;
find_now=&
message_info[i];
while
(1){
/*数字1.0代表了所有消息符号概率和,如果和不为1,这里需要更改*/
if(fabs(find_now->
probability-1.0)<
=DBL_MIN)
break;
find_father=&
message_info[find_now->
father<
0?
-find_now->
father+message_info_num-1:
find_now->
father];
if(find_father->
left==find_now->
a_i)
code[code_num++]='
1'
else
0'
find_now=find_father;
code[code_num]='
strrev(code);
/*反转code*/
message_info[i].code[0]='
strcat(message_info[i].code,code);
}目录
第一章总论1
1.1项目背景1
1.1.1项目名称及承办单位1
1.1.2承办单位1
1.1.3项目建设地点1
1.1.4可行性研究报告编制单位1
1.2报告编制依据和研究范围1
1.2.1报告编制依据1
1.2.2研究范围2
1.3承办单位概况2
1.4项目提出背景及必要性3
1.4.1项目提出的背景3
1.4.2项目建设的必要性4
1.5项目概况5
1.5.1建设地点5
1.5.2建设规模与产品方案5
1.5.3项目投资与效益概况5
1.6主要技术经济指标6
第二章市场分析及预测8
2.1绿色农产品市场分析及预测8
2.1.1生产现状8
2.1.2市场前景分析9
2.2花卉市场分析及预测11
2.2.1产品市场现状11
2.2.2市场需求预测12
2.2.3产品目标市场分析13
2.3中药材产品市场分析及预测13
2.3.1产品简介13
2.3.2产品分布现状分析15
2.3.3市场供求状况分析16
2.3.4市场需求预测17
第三章建设规模与产品方案20
3.1项目的方向和目标20
3.2建设规模20
3.3产品方案21
3.3.1优质高产粮食作物种植基地21
3.3.2无公害蔬菜种植基地21
3.3.3中药材种植基地21
3.3.4花卉种植基地21
第四章建设场址及建设条件22
4.1建设场址现状22
4.1.1建设场址现状22
4.1.2厂址土地权属类别及占地面积22
4.2建设条件22
4.2.1气象条件22
4.2.2水文及工程地质条件23
4.2.4交通运输条件23
4.2.5水源及给排水条件24
4.2.6电力供应条件24
4.2.7通讯条件24
4.3其他有利条件24
4.3.1农产品资源丰富24
4.3.2劳动力资源充沛25
4.3.3区位优势明显25
第五章种植基地建设方案26
5.1概述26
5.1.1种植基地运营模式26
5.1.2种植基地生产执行标准26
5.23000亩优质高产粮食作物种植基
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 统计 信源 哈夫曼 编码
![提示](https://static.bdocx.com/images/bang_tan.gif)