哈夫曼
1.原理代码
c语言给定权值建立,编码,解码哈夫曼(默认6位ABCDEF)
2.实用代码
题目:
已知某段通信报文内容,对该报文进行哈弗曼编码,并计算平均码长。
(1)统计报文中各字符出现的频度。(字符集范围为52个英文字母,空格,英文句号。报文长度<=200)
(2)构造一棵哈弗曼树,依次给出各字符编码结果。
(3)给字符串进行编码。
(4)给编码串进行译码。
(5)计算平均码长。
规定:
(1)结点统计:以ASCII码的顺序依次排列,例如:空格,英文句号,大写字母,小写字母。
(2)构建哈弗曼树时:左子树根结点权值小于等于右子树根结点权值。
(3)选择的根节点权值相同时,前者构建为双亲的左孩子,后者为右孩子。
(4)生成编码时:左分支标0,右分支标1。
输入
第一部分:报文内容,以’#’结束。
第二部分:待译码的编码串。
输出
依次输出报文编码串、译码串、平均码长,三者之间均以换行符间隔。
平均码长,保留小数点2位
AC代码:
踩到的坑:
1.虽然预留了全部符号的树,但是报文中使用了的字符要现统计,这点与上题大不相同,所造成的bug也很多:hu树的建立问题尤为突出
2.编码时仍按全部字符对号入座,文中没有的编码空字符串。这样便于查找。
3.平均码长为:编码长度乘以出现频率之和,在本题中为:编码长度乘以(该字符在文中的出现次数/文章总长度)
jpg
JPEG(Joint Photographic Experts Group)是联合图像专家小组的英文缩写。它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织ISO于1986年联合成立的一个小组,负责制定静态数字图像的编码标准。
小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即JPEG算法。JPEG算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。而用JPEG算法压缩出来的静态图片文件称为JPEG文件,扩展名通常为.jpg、.jpe*.jpeg。
JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。具体如下:
压缩算法:
l 有损的离散余弦变换(Discrete Cosine Transform,DCT);
l 无损的预测技术压缩。
数据编码方法:
l 哈夫曼编码;
l 算术编码;
编码模式:
l 基于DCT顺序模式:编/解码通过一次扫描完成;
l 基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;
l 无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;
l 层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。
在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。
jpg解码时的步骤
读出文档信息:
- 大体结构:
JFIF格式的JPEG文件(*.jpg)的一般顺序为:
SOI(0xFFD8)
APP0(0xFFE0)
[APPn(0xFFEn)]可选
DQT(0xFFDB)
SOF0(0xFFC0)
DHT(0xFFC4)
SOS(0xFFDA)
压缩数据
EOI(0xFFD9) - 字的高低问题
JPEG文件格式中,一个字(16位)的存储使用的是 Motorola 格式,也就是低地址存高字节(人类习惯) - 读出哈夫曼数据表
DHT内提供哈夫曼表数据:ID与类型,不同位数的码字数量,编码内容
开始为最小长度全为0,之后相同长度的在其上末位加一,下一个的位数大于前面时当前末位加一再补0到规定位数。