数据结构课程设计_数据结构课设 设计工具介绍-程序员宅基地

技术标签: 数据结构  

哈夫曼编码器

第1章 绪论

人们在使用计算机进行文件处理和传输的过程中,经常会使用到“压缩”这个概念,以节省存储空间,减少网络数据传输的压力,加快文件的传输速度,我们都会优先考虑将文件压缩打包后再进行传输。特别是网络视频资源,基本都是具备庞大的数据信息,如何实现文件的无损压缩,具有相当的现实意义。这也是多媒体信息处理领域的一个研究方向,经过不断的革新发展,如今,已经拥有强大的无损压缩编码技术。但是,如果追根溯源,计算机研究人员总是会提到美国数学家哈夫曼( David Huffman)于1952年发明的哈夫曼编码,是它拉开了数字编码技术的篇章。哈夫曼编码( Huffman Code)就是数据压缩技术中的一种无损压缩方法。
系统开发的背景为了提高信道利用率,缩短信息传输时间,降低传输成本,且在信息发送端通过个编码系统对待传数据预先编码,在信息接收端将传来的数据进行译码(复原),因此设计哈夫曼编码/译码器系统。
1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者香农共同研究过类似编码的导师。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法Shannon-Fano编码的最大弊端──自顶向下构建树。
1952年,David A. Huffman在麻省理工攻读博士时发表了《一种构建极小多余编码的方法》(A Method for the Construction of Minimum-Redundancy Codes)一文,它一般就叫做Huffman编码。
Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的这种编码思想提出了一种不定长编码的方法,也称霍夫曼(Huffman)编码。霍夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。
赫夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就称Huffman编码。下面引证一个定理,该定理保证了按字符出现概率分配码长,可使平均码长最短。

第2章 系统需求分析

2.1 设计工具介绍

本编译器本人给简单的设计为四个模块,分别是:输入字符和权值并建立哈夫曼树(包括结点i,权值,字符,双亲,左孩子,右孩子),根据哈夫曼树內容进行编码、根据输入数值打印出哈夫曼树以及退出功能。

2.2 需求分析

人们在使用计算机进行文件处理和传输的过程中,经常会使用到“压缩”这个概念,以节省存储空间,减少网络数据传输的压力,加快文件的传输速度,我们都会优先考虑将文件压缩打包后再进行传输。特别是网络视频资源,基本都是具备庞大的数据信息,如何实现文件的无损压缩,具有相当的现实意义。这也是多媒体信息处理领域的一个研究方向,经过不断的革新发展,如今,已经拥有强大的无损压缩编码技术。但是,如果追根溯源,计算机研究人员总是会提到美国数学家哈夫曼( David Huffman)于1952年发明的哈夫曼编码,是它拉开了数字编码技术的篇章。哈夫曼编码( Huffman Code)就是数据压缩技术中的一种无损压缩方法。
在传送电文时,人们总是希望传送时间尽可能短,这就是要求使电文代码长度尽可能短。利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统能够对待传输数据预先编码,在接收端将传来的数据进行译码。对于双工信道(即可以双向传输信息的信道),每段都需要一一个完整的编/译系统。所以为这样的信息收发站写一个哈夫曼的编译码系统。

在这里插入图片描述

设某信源产生有五种符号u1、u2、u3、u4和u5,对应概率P1=0.4,P2=0.1,P3=P4=0.2,P5=0.1。首先,将符号按照概率由大到小排队,如图所示。编码时,从最小概率的两个符号开始,可选其中一个支路为0,另一支路为1。这里,我们选上支路为0,下支路为1。再将已编码的两支路的概率合并,并重新排队。多次重复使用上述方法直至合并概率归一时为止。从图(a)和(b)可以看出,两者虽平均码长相等,但同一符号可以有不同的码长,即编码方法并不唯一,其原因是两支路概率合并后重新排队时,可能出现几个支路概率相等,造成排队方法不唯一。一般,若将新合并后的支路排到等概率的最上支路,将有利于缩短码长方差,且编出的码更接近于等长码。这里图(a)的编码比(b)好。
赫夫曼码的码字(各符号的代码)是异前置码字,即任一码字不会是另一码字的前面部分,这使各码字可以连在一起传送,中间不需另加隔离符号,只要传送时不出错,收端仍可分离各个码字,不致混淆。
实际应用中,除采用定时清洗以消除误差扩散和采用缓冲存储以解决速率匹配以外,主要问题是解决小符号集合的统计匹配,例如黑(1)、白(0)传真信源的统计匹配,采用0和1不同长度游程组成扩大的符号集合信源。游程,指相同码元的长度(如二进码中连续的一串0或一串1的长度或个数)。按照CCITT标准,需要统计2×1728种游程(长度),这样,实现时的存储量太大。事实上长游程的概率很小,故CCITT还规定:若l表示游程长度,则l=64q+r。其中q称主码,r为基码。编码时,不小于64的游程长度由主码和基码组成。而当l为64的整数倍时,只用主码的代码,已不存在基码的代码。
长游程的主码和基码均用赫夫曼规则进行编码,这称为修正赫夫曼码,其结果有表可查。该方法已广泛应用于文件传真机中。

第3章 系统详细设计

本课程设计主要功能是:
(1)初始化:键盘输入N个字符和N个权值(根据设计要求中给出的字符和频度选取),建立哈夫曼树;
(2)编码:利用建好的哈夫曼树生成哈夫曼编码;
(3)输出编码;
(4)输出译码;
(5)退出;
构造哈夫曼树的方法如下: 初始化:每个字符就是一-个结点,字符的频度就是结点的权: 1.将结点按频度从小到大排序: 2、选取频度最小的两个结点,以它们为儿子,构造出一个新的结点:新结点的权值就是它两个儿子的权值之和;构造之后,从原来的结点序列里删除刚才选出的那两个结点,但同时将新生成的结点加进去; 3、如果结点序列里只剩下一一个结点,表示构造完毕,退出。否则回到第-一步。 编码: 上面已经生成了树,接着就该对该树进行编码了。 可以假定,对某个结点而言,其左孩子在当前阶段的编码为0,右孩子的编 码为1.这样就可以通过“树的遍历”的方式来生成字符一编码对照表。 来到这里,基本上艰苦的已经完成了,对某个具体的字符串编码和解码就只 是简单的“查表一替换" 的工作了。 译码:
译码也是个简单的查表–替换过程。如果利用该种编码发送字符串,则它的“字符一编码”对应表 也必须发送过去,不然对方是不知道怎么解码的。对给出的一串编码,从左向右,将编码组合起来并查表,“一旦”找到有匹配的字符,则马上将当前的编码替换为对应的字符。因为该编码是不会出现"某-一个字符的编码是另一个字符编码的缀”这种情况的,也就是不会出现类似于“A 00 B 0010” 这样 的情况,所以译码出来的字符串是唯一-的,而且就是原来进行编码的那一个。

经过分析,确定本系统结构图如下图所示:

在这里插入图片描述
图3.1哈夫曼编译器系统结构模型

3.1初始化

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并显示出它的结点i,权值,字符,双亲,左孩子,右孩子。
哈夫曼树的定义

typedef struct{
   
    

char letter;//存储字符
int weight;//存储字符的权值
Int parent;/父亲
int lchild;/左孩子
int chilo;/右孩子
} HTNode, *HuffmanTree
 

在这里插入图片描述
图3.1.1

3.2 编码操作

利用以建好的哈夫曼树,对文件的正文进行编码,数值小的在左边,大的在右边,左边记为0,右边记为1,然后将结果输出在屏幕上。

//本结构存储哈夫曼树、编码等,便于后面的操作进行
typedef struct
{
   
    
HuffmanTree hT
动态分配数组存储哈夫曼编码表
HuffmanCode Hc
//记录输入字符的长度,编码用到
int len
char*c;//存储输入的字符
} Huf

在这里插入图片描述
图3. 2

3.3译码操作

在这里插入图片描述
图3. 3

3.4主函数

void main()
{
   
    
根据不同的选择,执行特定的函数,完成操作
}

第4章 系统实现

4.1 系统数据类型

根据系统所管理数据信息的要求和特点,将学生成绩信息定义成以下结构体类型:

struct HNode {
   
    int weight; int parent; int LChild; int RChild;
}

4.2 主函数

该函数中首先调用登录函数login(),用来显示用户的登录界面,要求输入用户密码,当密码正确时进入主菜单,根据用户选择的菜单项调用相应函数,实现相应的功能。当密码错误时退出主函数。主函数的源码如下:
void menu()
{
   
    
	cout << "=================================================" << endl;
	cout << "|****************哈夫曼树编码器*****************|" << endl;
	cout 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_45828598/article/details/107291021

智能推荐

稀疏编码的数学基础与理论分析-程序员宅基地

文章浏览阅读290次,点赞8次,收藏10次。1.背景介绍稀疏编码是一种用于处理稀疏数据的编码技术,其主要应用于信息传输、存储和处理等领域。稀疏数据是指数据中大部分元素为零或近似于零的数据,例如文本、图像、音频、视频等。稀疏编码的核心思想是将稀疏数据表示为非零元素和它们对应的位置信息,从而减少存储空间和计算复杂度。稀疏编码的研究起源于1990年代,随着大数据时代的到来,稀疏编码技术的应用范围和影响力不断扩大。目前,稀疏编码已经成为计算...

EasyGBS国标流媒体服务器GB28181国标方案安装使用文档-程序员宅基地

文章浏览阅读217次。EasyGBS - GB28181 国标方案安装使用文档下载安装包下载,正式使用需商业授权, 功能一致在线演示在线API架构图EasySIPCMSSIP 中心信令服务, 单节点, 自带一个 Redis Server, 随 EasySIPCMS 自启动, 不需要手动运行EasySIPSMSSIP 流媒体服务, 根..._easygbs-windows-2.6.0-23042316使用文档

【Web】记录巅峰极客2023 BabyURL题目复现——Jackson原生链_原生jackson 反序列化链子-程序员宅基地

文章浏览阅读1.2k次,点赞27次,收藏7次。2023巅峰极客 BabyURL之前AliyunCTF Bypassit I这题考查了这样一条链子:其实就是Jackson的原生反序列化利用今天复现的这题也是大同小异,一起来整一下。_原生jackson 反序列化链子

一文搞懂SpringCloud,详解干货,做好笔记_spring cloud-程序员宅基地

文章浏览阅读734次,点赞9次,收藏7次。微服务架构简单的说就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目。这么多小服务,如何管理他们?(服务治理 注册中心[服务注册 发现 剔除])这么多小服务,他们之间如何通讯?这么多小服务,客户端怎么访问他们?(网关)这么多小服务,一旦出现问题了,应该如何自处理?(容错)这么多小服务,一旦出现问题了,应该如何排错?(链路追踪)对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决它们。_spring cloud

Js实现图片点击切换与轮播-程序员宅基地

文章浏览阅读5.9k次,点赞6次,收藏20次。Js实现图片点击切换与轮播图片点击切换<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <script type="text/ja..._点击图片进行轮播图切换

tensorflow-gpu版本安装教程(过程详细)_tensorflow gpu版本安装-程序员宅基地

文章浏览阅读10w+次,点赞245次,收藏1.5k次。在开始安装前,如果你的电脑装过tensorflow,请先把他们卸载干净,包括依赖的包(tensorflow-estimator、tensorboard、tensorflow、keras-applications、keras-preprocessing),不然后续安装了tensorflow-gpu可能会出现找不到cuda的问题。cuda、cudnn。..._tensorflow gpu版本安装

随便推点

物联网时代 权限滥用漏洞的攻击及防御-程序员宅基地

文章浏览阅读243次。0x00 简介权限滥用漏洞一般归类于逻辑问题,是指服务端功能开放过多或权限限制不严格,导致攻击者可以通过直接或间接调用的方式达到攻击效果。随着物联网时代的到来,这种漏洞已经屡见不鲜,各种漏洞组合利用也是千奇百怪、五花八门,这里总结漏洞是为了更好地应对和预防,如有不妥之处还请业内人士多多指教。0x01 背景2014年4月,在比特币飞涨的时代某网站曾经..._使用物联网漏洞的使用者

Visual Odometry and Depth Calculation--Epipolar Geometry--Direct Method--PnP_normalized plane coordinates-程序员宅基地

文章浏览阅读786次。A. Epipolar geometry and triangulationThe epipolar geometry mainly adopts the feature point method, such as SIFT, SURF and ORB, etc. to obtain the feature points corresponding to two frames of images. As shown in Figure 1, let the first image be ​ and th_normalized plane coordinates

开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先抽取关系)_语义角色增强的关系抽取-程序员宅基地

文章浏览阅读708次,点赞2次,收藏3次。开放信息抽取(OIE)系统(三)-- 第二代开放信息抽取系统(人工规则, rule-based, 先关系再实体)一.第二代开放信息抽取系统背景​ 第一代开放信息抽取系统(Open Information Extraction, OIE, learning-based, 自学习, 先抽取实体)通常抽取大量冗余信息,为了消除这些冗余信息,诞生了第二代开放信息抽取系统。二.第二代开放信息抽取系统历史第二代开放信息抽取系统着眼于解决第一代系统的三大问题: 大量非信息性提取(即省略关键信息的提取)、_语义角色增强的关系抽取

10个顶尖响应式HTML5网页_html欢迎页面-程序员宅基地

文章浏览阅读1.1w次,点赞6次,收藏51次。快速完成网页设计,10个顶尖响应式HTML5网页模板助你一臂之力为了寻找一个优质的网页模板,网页设计师和开发者往往可能会花上大半天的时间。不过幸运的是,现在的网页设计师和开发人员已经开始共享HTML5,Bootstrap和CSS3中的免费网页模板资源。鉴于网站模板的灵活性和强大的功能,现在广大设计师和开发者对html5网站的实际需求日益增长。为了造福大众,Mockplus的小伙伴整理了2018年最..._html欢迎页面

计算机二级 考试科目,2018全国计算机等级考试调整,一、二级都增加了考试科目...-程序员宅基地

文章浏览阅读282次。原标题:2018全国计算机等级考试调整,一、二级都增加了考试科目全国计算机等级考试将于9月15-17日举行。在备考的最后冲刺阶段,小编为大家整理了今年新公布的全国计算机等级考试调整方案,希望对备考的小伙伴有所帮助,快随小编往下看吧!从2018年3月开始,全国计算机等级考试实施2018版考试大纲,并按新体系开考各个考试级别。具体调整内容如下:一、考试级别及科目1.一级新增“网络安全素质教育”科目(代..._计算机二级增报科目什么意思

conan简单使用_apt install conan-程序员宅基地

文章浏览阅读240次。conan简单使用。_apt install conan