数据结构c语言版哈夫曼编码,基于C语言的哈夫曼编码的实现

摘要:介绍了哈夫曼编码的思想,以及利用C语言实现哈夫曼编码的详细过程。

关键词:哈夫曼编码;权值;哈夫曼树;二叉树

中图分类号:TP312文献标识码:A文章编号:16727800(2012)009004003

0引言

数据通讯中,经常需要将传送的字符转换为由二进制字符0或1组成的二进制串,我们称此过程为编码。而哈夫曼树可以用来构造代码总长度最短的编码方案,将需要编码的字符作为叶节点,字符在电文中出现的频率作为权值,构造一颗二叉树,规定哈夫曼树的左分支为0,右分支为1,则从根节点到每个叶结点所经历的分支对应的0和1组成的数列变为该结点对应的字符编码。这种总长度最短的不等长编码就叫做哈夫曼编码。利用哈夫曼编码通信可以大大提高通信利用率,缩短通信传输时间,降低传输成本。

1问题描述

利用C语言编程实现哈夫曼编码。要求:用户输入各字母及使用频率(或频数),用程序输出二进制表示的哈夫曼编码,并采用菜单和会话方式的界面。

2算法思想

(1)哈夫曼编码根据与n个权值{w1,w2,……wn}对应的n个结点构成n棵二叉树的森林,F= {T1,T2,……Tn},其中每棵二叉树Ti(1

(2)在森林F中选出两棵根结点权值最小的树作为一棵新树的左右子树,且置新树的附加根结点的权值为其左右树上根结点的权值之和。

(3)从F中删除这两棵树,同时把新树加入F中。

(4)重复(2)和(3)直到只含有一棵树为止,此时便是哈夫曼树。

(5)树从根到每个叶子都有一条路径,对路径上的各分支约定,指向左子树的分支表示 ‘0’ 码,指向右子树的分支表示 ‘1’ 码 。

(6)取每条路径上 ‘0’ 或 ‘1’ 的序列作为各个叶子对应的字符编码,这就是哈夫曼编码。

3逻辑设计

树的逻辑结构是层次结构,树中有且仅有一个没有前驱的结点ht[0]称为树的根,除根ht[0]以外的每个结点都有且只有一个前驱,对于不是根的每一个结点ht[I]都有一个线性序列ht[0],ht[1],……ht[I-1],ht[I] (I>=0),其中ht[I]是ht[I-1]的后继。

4存储结构的设计

7结语

此程序是根据笔者平时积累的教学经验,结合数据结构和C语言编程技术开发完成。该算法简单易懂,源代码在visual C++中运行调试通过,对哈夫曼编码理论的学习有着较大帮助。

参考文献:

[1]严蔚敏,吴伟民.数据结构:第1版[M].北京:清华大学出版社,2003.

[2]朱站立.数据结构——使用C语言:第3版[M].西安:西安交通大学出版社,2004.

[3]陈桂琴.用C实现完整的哈夫曼编码系统[J].河北工程技术高等专科学校学报,2004(4).

[4]李亚岗,吕海莲.哈夫曼编码的Java实现[J].平顶山师范高等专科学校学报,2002(4).

你可能感兴趣的:(数据结构c语言版哈夫曼编码)