2004 年 12 月
第 4 期
河 北 工 程 技 术 高 等 专 科 学 校 学 报
JOU RNAL O F HEBE I EN G IN EER IN G AND TECHN ICAL COLL EGE
Dec. 2004
No. 4
文章编号: 1008- 3782
(
2004
)
04- 0041- 05
用
C
实现完整的哈夫曼编码系统
陈桂琴
(
河北工程技术高等专科学校 计算中心, 河北 沧州 061001
)
摘要: 给出了一个用
C
程序自动产生哈夫曼树叶结点及对应权值的哈夫曼编码系统。
关键词: 哈夫曼树; 结点; 权值; 哈夫曼编码
中图分类号:
TP
312
C
文献标识码:
A
哈夫曼编码, 常用于通信及数据传送中的二进制编码。如在进行快速远距离电报通信中, 它能将传送的
文字信息转换成由二进制字符 0 和 1 组成的二进制串, 且能使电文编码最短、最合理, 从而最经济。
要实现哈夫曼编码, 应先构造哈夫曼树, 而在构造哈夫曼树之前, 必须由用户输入电文中字符的种类及
各字符在电文中出现的次数, 即需要用户提供哈夫曼树叶结点个数及各叶结点对应的权值。如何计算出这些
数据, 是在实际中不能避开的课题。
本文就是为解决此问题而设计的一个完整的哈夫曼编码系统。运行该系统, 用户只需输入电报文, 系统
就能迅速输出对应电文的准确二进制编码, 而其中哈夫曼树叶结点及对应权值则由系统自动提供。
1 哈夫曼编码系统
111 压缩电文, 提取哈夫曼树叶结点
构造哈夫曼树, 需要的数据之一就是叶结点, 而电文中所有可能出现的字符种类正是哈夫曼树叶结点。
根据电报内容提取出文中出现的字符种类, 是一个较复杂的字符串处理问题。在本系统中, 巧妙地使用了
strstr
()
函数, 通过对字串的反复截取和拼接, 去掉重复出现的字符, 从而提取出电文中字符种类集合。该功
能由
getcode
()
函数完成, 在
getcode
()
函数中用字串
S
5 保存该哈夫曼树上所有叶结点。
112 统计哈夫曼树上各叶结点的权值
构造哈夫曼树, 需要的数据之二是各叶结点的权值。在本系统中, 笔者先去掉电文中的空格, 然后再对电
文各类字符按出现顺序逐一进行统计, 将统计出的各权值存放到结构体
HNOD ETYPE
的变量
huffnode
[
i
].
w eight
中, 该功能由
huffm antree
()
函数完成。
1. 3 构造哈夫曼树, 完成每个叶结点的编码
有了叶结点和对应权值, 就可以依据哈夫曼算法理论, 实现构造哈夫曼树及完成对哈夫曼树上每个叶结
点的编码。例如: 当我们输入电文“
call of non function
", 其字符种类集合应为
c
、
a
、
l
、
o
、
f
、
u
、
t
、
i
, 各字符在电
文中出现的次数集合为 2、1、2、3、2、4、1、1、1, 每个字符的哈夫曼编码分别为:
c
= 010,
a
= 1010,
l
= 011,
o
=
111,
f
= 100,
n
= 00,
u
= 1011,
t
= 1100,
i
= 1101, 构造出的哈夫曼树如图 1 所示。
1. 4 输出电文编码
有了每个字符的哈夫曼编码, 再按电文内容可得到电文的全部二进制编码, 如我们可得到电文“
call of
收稿日期: 2004209215
作者简介: 陈桂琴
(
19482
)
, 女, 河北东光人, 河北工程技术高等专科学校副教授。研究方向: 计算机基础教育。