信息论课程设计
- 格式:doc
- 大小:313.50 KB
- 文档页数:19
信息论基础课程设计报告书班级: 计算331 姓名: 王宇(200909014217) 设计题目:课程设计软件设计时间: 2012.7.4 至2012.7.8指导教师:评语:_________________________________________ _________________________________________ _________________________________________ _________________________________________ 评阅成绩:____评阅教师:_____目录华北科技学院课程设计说明书设计总说明 (1)前言 (2)第1章总体设计方案 (3)1.1 软件结构设计 (3)第2章算法思想及设计 (5)2.1香农编码 (5)2.1.1香农编码思想: (5)2.1.2香农编码算法设计: (6)2.2费诺编码 (6)2.2.1费诺编码思想 (6)2.2.2费诺编码算法设计 (7)第3章软件详细设计 (8)3.1主界面设计 (8)3.2功能设计 (8)3.2.1香农编码的实现 (8)3.2.2费诺编码的实现 (15)3.2.3有关文档的链接 (22)3.2.4皮肤切换的设计 (23)第4章软件测试 (26)4.1香农编码的测试 (26)4.1.1 软件运行及结果测试 (26)4.2费诺编码的测试 (27)4.2.1 软件运行及结果测试 (27)4.3测试结果 (29)第5章总结 (30)参考文献 (31)附录 (32)设计总说明早期的数据压缩起源于人们对概率的认识。
当对文字信息进行编码时,如果为出现概率较高的字母赋予较短的编码,为出现概率较低的字母赋予较长的编码,平均编码长度就能缩短不少。
印象中的著名的Morse电码就是一个范例。
信息论之父C.E.Shannon曾指出,任何信息都存在冗余,冗余大小与信息中每个符号的出现概率(不确定性)有关。
信息理论基础第三版教学设计
一、教学目标
本教学设计旨在通过教学,使得学生了解信息理论的基本概念,对信息量、熵、信源编码、信道编码等概念有深入的认识,并且能够应用到实际问题中,还要提高学生的分析问题和解决问题的能力。
二、教学内容与方法
2.1 课程模块设计
本课程分为四个模块,分别是:
•信息论基础
•信息量和熵
•信源编码和信道编码
•应用案例分析
2.2 教学方法与策略
•理论知识讲解:采用板书和PPT形式,详细讲解各个概念和定理的含义,同时给出简单的数学公式。
•课堂探讨:引导学生讨论和分析课程内容相关的实际问题。
•实例演练:给学生提供一些实例,让他们应用所学知识进行问题分析和解决,同时让学生发挥创新能力,探索问题的多种解决方案。
三、教学评价
3.1 评价方式
•学生课堂发言的质量和数量
•期末试卷的成绩
•学生的作业质量
3.2 评价标准
•学生课堂发言的质量和数量:能够准确表述自己的观点,对问题有深刻的理解和认识,能够与其他学生进行讨论和交流。
•期末试卷的成绩:能够准确理解概念,运用所学知识进行问题分析和解决。
•学生的作业质量:能够独立完成作业,从而展示出对所学知识的理解和应用能力。
四、总结
通过本次教学,学生们对信息理论的基本概念、信息量、熵、信源编码和信道编码等方面有了更深的认识。
通过实例演练的过程,学生也能够应用所学知识进行问题分析和解决,同时提高了他们的信息分析和解决问题的能力。
注:本文档仅为示范文档,如有不妥之处,敬请谅解。
信息论基础理论与应用第四版课程设计1. 课程概述本课程旨在让学生掌握信息论的基本理论以及其应用,包括信息量、信源、信道、编码、解码、信道容量等概念的介绍。
通过学习本课程,学生将会了解信息论的基本原理,能够设计高效的信道编码方案,提高信息通信的效率。
2. 教学目标2.1 基本目标1.掌握信息论的基本概念和原理;2.能够设计高效的信道编码方案;3.能够应用信息论知识解决信息通信问题。
2.2 进阶目标1.理解信息论的发展历程和未来发展方向;2.掌握信息隐藏和隐私保护在信息论中的应用。
3. 教学内容3.1 信息论基础理论1.信息量的概念和单位;2.信源的度量和熵;3.信道模型和条件熵;4.信息瓶颈定理和链路容量。
3.2 信道编码与解码1.几种常见的信道编码方式;2.译码器的设计方法;3.Viterbi算法;4.分组密码和流密码。
3.3 信息隐藏和隐私保护1.隐写术的基本原理;2.水印技术的应用;3.隐私保护和差分隐私。
4. 教学方法1.理论授课:讲解信息论基础概念和原理;2.经典案例分析:分析信息论在通信系统中的应用;3.基于MATLAB的仿真实验:自行实现各种信道编码解码方法并进行仿真实验;4.开放问题研究:学生独立挖掘某一方面的信息论应用并撰写小论文。
5. 考核方式1.平时成绩(30%):包括小组讨论和课堂表现;2.作业成绩(30%):包括程序设计和实验报告;3.考试成绩(40%):闭卷考试。
6. 参考教材1.Thomas M.Cover, Joy A.Thomas, 《Elements of InformationTheory》(第2版), Wiley, 2006.;2.李舟, 卑瑞生, 《数字通信的基础与前沿》(第2版), 电子工业出版社, 2015.;3.张颂葆, 丘广香, 《信息论基础与应用》(第4版), 高等教育出版社, 2020.。
7. 实验设备1.MATLAB 2019b;2.密码本模块。
课程设计目录一、概述1、设计目的2、设计任务3 、所用软件环境二、需求分析1、问题描述2、基本要求三、设计过程1、霍夫曼编码2、费诺编码3、游程编码4、算术编码一、概述1设计目的1.1深刻理解信源编码的基本思想与目的;1.2深刻理解并掌握霍夫曼编码译码、费诺编码译码、游程编码译码、算术编码译码的原理与方法;1.3提高综合利用所学理论知识独立分析和解决问题的能力,提高编程能力。
2设计任务2.1对任意的字符分别进行2元霍夫曼编码、2元费诺编码、游程编码和算术编码,并进行相应的译码;2.2注意编码效率的计算.3 所用软件环境Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。
Visual C++是一个功能强大的可视化软件开发工具。
自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。
Visual C++6.0由Microsoft开发, 它不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。
Visual C++6.0由许多组件组成,包括编辑器调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。
这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境Microsoft的主力软件产品。
Visual C++是一个功能强大的可视化软件开发工具。
二、需求分析1问题描述1.1霍夫曼编码首先要解决的问题是给定一段字符串,如何建造霍夫曼树;怎样根据该树求每个字符的编码,并对该段字符串进行编码;怎么样将得到的编码进行译码;怎么样遍历输出树中的叶子节点。
1.2费诺编码,给定一段字符串,如何排序;分治法编码如何实现;如何计算频率并求编码效率。
信息论–基础理论与应用课程设计一、前言信息论是一门研究信息量、信息传输、信息压缩、误差控制等问题的学科,它在计算机科学、通信工程、数据处理等领域都有广泛应用。
在这门课程中,我们将会学习信息论的基础理论以及其在实际应用中的重要性。
二、课程设计2.1 课程目标本课程主要的目标是掌握信息论中的基础理论,包括信息熵、香农编码、汉明编码、布尔-哈夫曼编码等,以及它们在实际应用中的具体实现。
同时,我们还将学习到纠错编码、压缩技术、密码编码等方面的内容,以了解信息论在通信、数据处理、加密等领域中的具体应用。
2.2 课程大纲本课程的大纲如下:第一章:概述介绍信息论的基本概念、基本方法、基本技术以及其在实际应用中的重要性。
第二章:信息熵介绍信息熵的概念、定义、计算方法以及其在信息论中的作用,包括熵的性质、最大熵原理、条件熵等。
第三章:编码理论介绍编码理论中的基本概念,如符号、码字、编码方式等,以及香农编码、汉明编码、布尔-哈夫曼编码等常见编码方法。
第四章:通信理论介绍通信理论中的基本概念,如信息传输、信道、信噪比等,以及应用于通信理论的一些基本技术,如调制技术、多路复用技术、误差控制技术等。
第五章:数据压缩介绍数据压缩的基本概念,包括无损压缩和有损压缩,以及一些常见的压缩算法,如LZW算法、哈夫曼算法等。
第六章:纠错码介绍纠错码的概念、种类、构造以及在实际应用中的具体实现,以了解在通信、数据处理等领域中的具体应用。
第七章:密码编码介绍密码编码的基本概念,包括对称加密和非对称加密等,以便理解在加密通信方面中的具体应用。
2.3 课程教材《信息论基础与应用(第二版)》颜宏源、李健等编著。
2.4 课程考核本课程的考核方式包括平时课堂表现、作业以及期末考试,其中作业占30%,期末考试占50%,平时表现占20%。
三、结语通过这门课程的学习,我们可以深入了解信息理论的基础理论以及其在实际应用中的具体实现。
这对于我们在计算机科学、通信工程、数据处理等领域中的工作都是有很大帮助的。
信息论教案课题名称:信息论教学目标:1. 理解信息论的基本概念和应用,掌握信息的度量标准;2. 掌握香农信息量、信息熵、信息传输等基本原理;3. 能够运用信息论的基本原理解决实际问题,了解信息论在现代通信、计算机科学等领域的应用。
教学重点与难点:重点:- 信息量和信息熵的概念及其计算方法。
- 信息的传输和压缩原理。
- 信息论在实际生活中的应用。
难点:- 信息熵的计算和理解。
- 如何将信息论原理与实际生活中的技术问题联系起来。
教学方法:- 讲解法:通过详细的讲解和示例帮助学生理解概念。
- 互动法:通过问题引导和讨论,帮助学生更好地掌握信息论的核心思想。
- 案例法:结合实际案例讲解信息论的应用,提升学生对知识的理解和运用能力。
教学过程与课本讲解:首先,我们从最基础的概念开始讲起。
信息论是什么呢?其实就是研究信息的度量、传输和存储的一门学科。
信息论的奠基人是克劳德·香农(Claude Shannon),他提出了“信息熵”的概念,这个概念不仅仅是对信息的数学描述,也深刻影响了我们如何理解和处理信息。
香农的信息量和信息熵:香农认为信息量的大小与不确定性有关。
举个例子,假设你有两个朋友,一个每天都按时到,另一个有时会迟到。
如果今天你的朋友准时到达,你大概就不太惊讶,因为他几乎总是按时到。
可是,如果那个常常迟到的朋友今天准时到达,你会觉得这一天的信息量很大,因为它超出了你的预期,减少了你的不确定性。
信息熵则是用来量化不确定性的度量。
比如说,如果你丢了钥匙,你的情绪就像是个高熵的系统,因为你根本不知道钥匙丢在哪。
信息熵越高,表示系统的不确定性越大。
课本原文分析:我们来看课本中的一段话:“香农通过一个简单的模型定义了信息量,并以此为基础提出了信息熵的概念。
信息熵是一个用于量化信息内容的不确定性度量。
一个系统的信息熵越高,表示这个系统的状态越不确定,获得的信息量也就越大。
”分析:这段话首先定义了信息量和信息熵,提出了两者的关系。
成绩:2016-2017学年第1学期《信息论》课程设计学院名称:班级学号:学生:教师:2016年12 月一、判定唯一可译码1. 任务说明输入:任意的一个码(即已知码字个数及每个具体的码字) 输出:判决结果(是/不是)输入文件:in1.txt ,含至少2组码,每组的结尾为”$”符 输出文件:out1.txt ,对每组码的判断结果说明:为了简化设计,可以假定码字为0,1串2. 实现原理判断方法:将码C 中所有码字可能的尾随后缀组成一个集合F ,当且仅当集合F 中没有 包含任一码字,则可判断此码C 为唯一可译变长码。
构成集合F :首先观察码C 中最短的码字是否是其他码字的前缀。
若是,将其所有可能 的尾随后缀排列出。
就是将其他码字序列中截去与其最短码字相同的前缀 部分,将余下的序列为尾随后缀。
而这些尾随后缀又可能是某些码字的前 缀,或者最短码字又仍是这些尾随后缀的前缀,再将由这些尾随后缀产生 的新的尾随后缀列出。
然后再观察这些新的尾随后缀是否是某些码字的前 缀,或观察有否其他码字是这些新的尾随后缀的前缀,再将产生的尾随后 缀列出,依次下去,直至没有一个尾随后缀是码字的前缀或没有新的尾随 后缀产生为止。
这样,首先获得的是由最短码字能引起的所有尾随后缀。
接着,按照上述步骤将次短的码字、......所有码字可能产生的尾随后缀前部列出。
由此得到由码C 的所有可能的尾随后缀组成的集合F 。
参考算法伪代码:For all ,i j W W C ∈ doif i W 是j W 的前缀 then将相应的后缀作为一个尾随后缀放入集合0F 中 End if End forLoopFor all i W C ∈ doFor all j n W F ∈ doif i W 是j W 的前缀 then将相应的后缀作为一个尾随后缀放入集合1n F +中 Else if j W 是i W 的前缀 then将相应的后缀作为一个尾随后缀放入集合1n F +中End if End for End for i i F F ←If ,i i W F W C ∃∈∈ thenReturn falseElse if F 中未出现新的元素 thenReturn true End if//能走到这里,说明F 中有新的元素出现,需继续End loop3. 实现源码#include <iostream> #include <fstream> #include <stdio.h> #include <string.h> using namespace std;#pragma warning (disable :4996) char c[100][50]; //保存码字 char f[300][50]; //保存尾随后缀int N, sum = 0; //N 为码字的个数,sum 为尾随后缀个数 int flag; //判断是否唯一可译标志位//检测尾随后缀void patterson(char c[], char d[]) { int i, j, k; for (i = 0;; i++) { If (c[i] == '\0'&&d[i] == '\0')//两字符串一样长,跳出 break ; if (c[i] == '\0') //d 比c 长,将d 的尾随后缀放入f 中 { for (j = i; d[j] != '\0'; j++) f[sum][j - i] = d[j]; f[sum][j - i] = '\0'; for (k = 0; k<sum; k++) { if (strcmp(f[sum], f[k]) == 0) /*查看当前生成的尾随后缀在f 集合中是否存在*/ { sum--; break ; } } sum++; break ;}if (d[i] == '\0') //c比d长,将c的尾随后缀放入f中{for (j = i; c[j] != '\0'; j++)f[sum][j - i] = c[j];f[sum][j - i] = '\0';for (k = 0; k<sum; k++){if (strcmp(f[sum], f[k]) == 0) /*查看当前生成的尾随后缀在f集合中是否存在*/{sum--; break;}}sum++;break;}if (c[i] != d[i])//字符不一样了也退出(前缀不同)break;}}void main(){int k = 0, N = 0, m = 0, a[50], z = 0;a[m] = N; m++;fstream file1;file1.open("out1.txt");//码字读取FILE *file;file = fopen("in1.txt", "r+");int num = fgetc(file) - 48;for (int n = 0; n < num; n++){int i = 0, j;if (fgetc(file) == ' ')N += (fgetc(file) - 48);else N += (fgetc(file) - 48);a[m] = N; m++;fgetc(file);for (k; k < N; k++){for (int q = 0;; q++){char temp = fgetc(file);c[k][q] = temp;if (temp == ' ' || temp == '$'){c[k][q] = '\0';break;}}}//生成尾随后缀flag = 0;for (i = a[z]; i<N - 1; i++)//判断码本身是否重复for (j = i + 1; j<N; j++){if (strcmp(c[i], c[j]) == 0){flag = 1; break;}}if (flag == 1)//如果码本身有重复,就可以断定它不是唯一可译码{for (int y = a[z]; y < N; y++)file1 << c[y] << ' ';file1 << "不是唯一可译码。
信息论基础教案篇1一、教学目标(一)知识与技能目标1. 学生能够准确理解信息的概念,包括信息的定义、信息的度量(如熵、互信息等)。
在理解概念的基础上,能熟练运用相关公式进行计算,例如计算离散信源的熵。
2. 掌握信息论中的基本定理,像香农三大定理(无失真信源编码定理、有噪信道编码定理、保真度准则下的信源编码定理)。
能够阐述这些定理的内容,并且可以用简单的例子解释定理的意义。
例如,用日常生活中的通信场景来解释有噪信道编码定理,让学生明白在存在噪声干扰的通信环境下,如何保证信息的可靠传输。
3. 学会使用信息论的知识分析简单的通信系统或者数据处理系统。
比如,能够分析一个简单的数字通信系统中,从信源编码、信道编码到译码的整个过程中,信息是如何被处理和传输的,每个环节对信息的准确性和有效性有什么影响。
(二)过程与方法目标1. 通过实际案例分析,培养学生观察、分析和解决问题的能力。
例如,给出一些实际的通信故障案例,让学生从信息论的角度去分析故障产生的原因,是因为信息编码错误,还是信道传输过程中的噪声干扰等原因造成的。
在这个过程中,引导学生学会从复杂的现象中提取关键信息,运用所学的信息论知识进行推理和判断。
2. 采用小组合作学习的方式,提高学生的团队协作能力和沟通能力。
在学习信息论的过程中,安排一些小组任务,如设计一个简单的信息编码方案。
小组成员需要共同讨论、分工合作,完成方案的设计。
在这个过程中,学生们需要相互交流自己的想法,协调彼此的工作,从而提高团队协作和沟通能力。
3. 鼓励学生自主探究,培养学生的创新思维。
在讲解完基本的知识和定理后,给学生提出一些拓展性的问题,如如何改进现有的信息编码方式,以提高信息传输的效率和可靠性。
让学生自己去查阅资料、思考、尝试,提出自己的创新想法。
(三)情感态度与价值观目标1. 激发学生对信息论这门学科的兴趣。
信息论是一门比较抽象和理论性较强的学科,通过引入一些有趣的实际应用案例,如密码学中的信息加密、大数据中的数据压缩等,让学生感受到信息论在现代科技中的广泛应用和重要性,从而激发他们对这门学科的学习兴趣。
应用信息论基础教学设计一、引言信息论是探索信息传输和处理的学科,是信息科学的理论基础。
信息论的基本概念、原理、技术在现代通信、计算机、网络等领域中得到广泛应用。
信息论在计算机、通信、数学等领域中应用广泛,因此在大学教育中有着重要的地位。
在信息时代,解决信息安全、通信速度、数据压缩等问题是目前从事通信、计算机行业人员必备的基本技能。
本课程以信息论基础理论为依据,而设计的课程。
本文将从教学目标、教学内容、课程设置、教学方法与手段、评价方式等方面来进行详细阐述。
二、教学目标此课程旨在通过讲授信息论基础理论,培养学生以下能力:1.理解信源、信源熵、信道、信道容量、信噪比、误码率等基本概念,并运用相应的公式解决问题。
2.熟悉常见的仿真工具,如MATLAB等,通过实验操作进行信息论理论的验证。
3.理解信息论在通信、数据压缩和安全通信中的应用,了解现代通信、无线通信、光纤通信等领域的基础知识。
4.学会在团队协作中合理分工,进行信息技术应用的研究和实践。
三、教学内容本课程的主要内容包括:1.信源与信源熵–信源的基本概念–信源熵的定义–熵的基本性质与定理2.信道与信道容量–信道的基本概念–信道模型–信道容量的概念和计算方法3.信道编码基础–信道编码的基本概念–信道编码的目标–信道编码的优势–线性码、卷积码、Turbo码、Turbo交织码、LDPC码的介绍4.信道编码应用–信道编码在数字通信中的应用–信道编码在数据压缩中的应用–信道编码在安全通信中的应用5.其他应用–异或和检验和及应用–小世界网络及其应用四、课程设置本课程时长为16周,每周3学时,排课安排如下:时间课程内容第1-3周信源与信源熵第4-6周信道与信道容量第7-9周信道编码基础第10-12周信道编码应用第13-16周异或和检验和及应用与小世界网络及其应用,结课作业指导五、教学方法与手段本课程采用以下教学方法:1.讲授与自主学习相结合,通过学生自主学习、教师指导、课堂解答等方式来达成教学目标。
信息论算术编码课程设计一、课程目标知识目标:1. 学生理解信息论中编码的基本概念,掌握算术编码的原理和步骤。
2. 学生能够运用算术编码方法对给定数据进行编码和解码。
3. 学生了解算术编码在信息传输和压缩中的应用。
技能目标:1. 学生掌握算术编码的具体算法,能够运用编程语言实现算术编码过程。
2. 学生具备分析数据特点并选择合适编码方法的能力,提高信息处理的效率。
情感态度价值观目标:1. 学生培养对信息论和编码技术的兴趣,激发学习主动性和创新意识。
2. 学生认识到编码技术在现代通信和计算机领域的重要性,增强对科技进步的敬畏感。
3. 学生通过团队协作解决问题,培养合作精神和沟通能力。
分析课程性质、学生特点和教学要求:本课程为高中信息技术学科,旨在帮助学生掌握信息论中算术编码的知识。
考虑到学生已具备一定的数学基础和编程能力,课程将重点放在算术编码的原理、实现和应用上。
教学要求注重理论与实践相结合,鼓励学生动手实践和团队协作,培养解决问题的能力。
课程目标分解为具体学习成果:1. 学生能够阐述算术编码的原理和步骤。
2. 学生能够运用编程语言实现算术编码,并成功解码。
3. 学生能够分析不同编码方法的优缺点,选择合适的方法进行信息传输和压缩。
4. 学生通过小组合作,共同完成算术编码的实际应用案例,提升团队协作能力。
二、教学内容1. 算术编码基本概念:信息论基础,编码的基本原理,算术编码的定义和特点。
- 教材章节:第三章第二节“编码方法及其应用”2. 算术编码原理与步骤:算术编码的数学模型,编码和解码的详细步骤。
- 教材章节:第三章第三节“算术编码的原理与实现”3. 编程实现算术编码:利用编程语言(如Python)实现算术编码的算法。
- 教材章节:第三章第四节“算术编码的编程实现”4. 算术编码的应用案例分析:分析实际应用中的算术编码案例,如文件压缩、图像传输等。
- 教材章节:第三章第五节“算术编码的应用实例”5. 编码方法比较与选择:比较算术编码与其他编码方法(如哈夫曼编码、LZ77等)的优缺点,讨论不同场景下的编码选择。
电子科技大学电子工程学院信息论课程设计报告课程名称:信息编码与加密课程设计报告学生姓名:农瀚学号:2014020908021 指导教师:李万春一、课程设计名称:编程实现霍夫曼、费诺、香农编码二、课设原理:1)霍夫曼编码:霍夫曼编码的平均码长最短,是最佳编码。
编码步骤如下:(1)将信源符号按概率大小排序;(2)对概率最小的两个符号求其概率之和,同时给两幅号分别赋予码元0和1;(3)将概率之和当做一个新符号的概率。
与剩下的概率一起,形成一个缩减信源,再重复上述步骤,直到概率和为1为止;(4)按上述步骤实际上构成了一个码树,从根到端点经过的树枝即为码字。
2)费诺编码:编码步骤如下:(1)将信源概率从大到小排序;(2)将信源符号分成两组,使两组信源符号的概率之和近似相等,并给两组信源符号分别赋0和1;(3)再把各个小组的信源符号细分为两组并赋码元,方法与第一次分组相同;(4)如此一直下去,直到每一个小组只含一个信源符号为止;(5)由此可构造成一个码树,所有终端节点上的码字组成费诺码。
3)香农编码:编码方法如下:⑴将信源消息符号按其出现的概率大小依次排列p(u1)≥p(u2)≥…≥p(un)⑵确定码长Ki (整数) :Ki= []——取整⑶为了编成唯一可译码,计算第i个消息的累加概率⑷将累加概率Pi变换成二进制数。
⑸取pi二进制数的小数点后Ki位即为该消息符号的二进制数。
三、课设目的:通过编程实现三种方式的编码,掌握三种编码方式的步骤。
四、课设内容:三种编码方式的编程思路:1、霍夫曼编码:(1)对给定的n个权值{W1,W2,W3,...,Wi,...,Wn}构成n棵二叉树的初始集合F= {T1,T2,T3,...,Ti,...,Tn},其中每棵二叉树Ti中只有一个权值为Wi的根结点,它的左右子树均为空。
(为方便在计算机上实现算法,一般还要求以Ti的权值Wi的升序排列。
)(2)在F中选取两棵根结点权值最小的树作为新构造的二叉树的左右子树,新二叉树的根结点的权值为其左右子树的根结点的权值之和。
(3)从F中删除这两棵树,并把这棵新的二叉树同样以升序排列加入到集合F中。
(4)重复二和三两步,直到集合F中只有一棵二叉树为止。
2、费诺编码的编程思路:(1)先使用冒泡法对信源概率概率排序;(2)依次将按排好序的符号概率进行近似1:1分成两大组;(3)对各组赋予一个二进制码元“0”和“1”;(4)输出符号,符号概率及编码。
3、香农编码:(1)对于一个给定的符号列表,制定了概率相应的列表或频率计数,使每个符号的相对发生频率是已知。
(2)排序根据频率的符号列表,最常出现的符号在左边,最少出现的符号在右边。
(3)清单分为两部分,使左边部分的总频率和尽可能接近右边部分的总频率和。
(4)该列表的左半边分配二进制数字0,右半边是分配的数字1。
这意味着,在第一半符号代都是将所有从0开始,第二半的代码都从1开始。
(5)对左、右半部分递归应用步骤3和4,细分群体,并添加位的代码,直到每个符号已成为一个相应的代码树的叶。
五、器材(设备、元器件):计算机、visual studio2017社区版六、设计代码:见附录九、实验数据及结果根据上述实验程序得到的实验数据及结果如下:霍夫曼编码:费诺编码:香农编码:十、结论完成了20个非等概随机信源的霍夫曼、费诺和香农编码,并给出了编码效率和码字。
十一、总结及心得体会通过这次课程设计,我掌握了三种编码方式的步骤,并能够利用编程实现编码,提高了自己的编程水平和对该知识点的掌握程度。
附录代码:// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
///*******霍夫曼编码*************/#include"stdafx.h"#include<algorithm>#include<iostream>#include<math.h>#include<stdlib.h>#include<stdio.h>#include<time.h>using namespace std;#define SourNum 20#define MAXBIT 100#define MaxValue 10000#define MAXLEAF 30#define MAXNODE MAXLEAF*2 -1double Sp[SourNum];char coder[100][100];int bitlong[100];void ProSource()//产生非等概信源的函数{int n = 0;srand((unsigned)time(0));double sum = 0;while (1){Sp[n] = (double)rand() / (RAND_MAX);//产生随机浮点数sum = sum + Sp[n];if (sum < 1 && Sp[n] <0.086){n++;if (n >19)break;else continue;}else{sum = sum - Sp[n];Sp[n] = 0;continue;}}Sp[SourNum] = 1 - sum;}/*******霍夫曼编码*************/typedef struct{int bit[MAXBIT];int start;} HCode;typedef struct{double weight;double parent;double lchild;double rchild;int last;} HNodeType;void HuffmanTree(HNodeType HuffNode[MAXNODE], int n){int i, j, x1, x2;;double m1, m2;for (i = 0; i < 2 * n - 1; i++){HuffNode[i].weight = 0;HuffNode[i].parent = -1;HuffNode[i].lchild = -1;HuffNode[i].rchild = -1;}for (i = 0; i < n; i++){HuffNode[i].weight = Sp[i];}for (i = 0; i < n - 1; i++){m1 = m2 = MaxValue;x1 = x2 = 0;for (j = 0; j < n + i; j++){if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1){m2 = m1;x2 = x1;m1 = HuffNode[j].weight;x1 = j;}else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1){m2 = HuffNode[j].weight;x2 = j;}}HuffNode[x1].parent = n + i;HuffNode[x2].parent = n + i;HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;HuffNode[n + i].lchild = x1;HuffNode[n + i].rchild = x2;}}double CodEffi()//求编码效率{int AveraLong = 0, SumLong = 0;double H = 0, CE = 0;for (int i = 0; i < SourNum; i++){SumLong = SumLong + bitlong[i];}AveraLong = SumLong / SourNum;for (int j = 0; j < SourNum; j++){H = (-Sp[j])*(log(Sp[j]) / log(2)) + H;}CE = H / AveraLong;return CE;}int main(){ProSource();sort(Sp, Sp + SourNum);HNodeType HuffNode[MAXNODE];HCode HuffCode[MAXLEAF], cd;int i, j, c, p, n;n = SourNum;HuffmanTree(HuffNode, SourNum + 1);for (i = 0; i < n; i++){cd.start = n - 1;c = i;p = HuffNode[c].parent;while (p != -1){if (HuffNode[p].lchild == c)cd.bit[cd.start] = 0;elsecd.bit[cd.start] = 1;cd.start--;c = p;p = HuffNode[c].parent;}for (j = cd.start + 1; j<n; j++){HuffCode[i].bit[j] = cd.bit[j];}HuffCode[i].start = cd.start;}memset(coder, '\0', sizeof(coder));int temp=0;for (i = 0; i<n; i++){cout <<"信源 "<< i <<"编码为:";for (j = HuffCode[i].start + 1; j < n; j++){cout << HuffCode[i].bit[j];coder[i][temp]= char(HuffCode[i].bit[j]+48);temp++;}temp = 0;cout <<" 信源概率:"<< Sp[i];cout <<" 字长:"<< strlen(coder[i]);printf("\n");bitlong[i] = strlen(coder[i]);}CodEffi();cout <<"\n编码效率: "<< CodEffi() * 100 <<"%\n";return 0;}// 费诺编码.cpp : 定义控制台应用程序的入口点。