java哈夫曼编码与译码_数据结构与算法系列研究六——哈夫曼编码与译码

本文详细介绍了哈夫曼编码与译码的概念、哈夫曼树的构造过程,以及如何使用Java实现哈夫曼编码的生成与译码。通过实例展示了编码与译码的过程,并提供了关键的数据结构和算法描述。最后,给出了完整的实验实现,包括输入输出要求、数据结构定义和部分源代码片段。
摘要由CSDN通过智能技术生成

哈夫曼编码与译码

一、哈夫曼编码定义

1.1、基本术语

路径:  从一结点到另一结点上的分支构成这两个结点的路径。

路径长度:  路径上的分支数目。

树的路径长度:  从根到所有结点的路径长度之和。

结点的带权路径长度:  从该结点到树根之间的路径长度与结点上权值的乘积。

树的带权路径长度:  树中所有叶子结点的带权路径长度之和。

fdcf49e2acbf03017b1dab4aa11f13ac.png

1.2、哈夫曼树定义: 设有n 个权值 {w1,w2,......wn},试构造具有 n 个叶结点的二叉树,每个叶结点权值为 wi ,则其中带权路径长度WPL最小的二叉树称为哈夫曼树(最优二叉树)。特点:权值越大的叶子离根越近。若叶结点上的权值均相同,则完全二叉树一定是最优二叉树,否则完全二叉树不一定是最优二叉树。

c4bbb21b57c845958943e652ca00d73b.png

c94055947e0c70b154ffc418e2c19830.png

94d46e23171726b173c1acf41c81be1e.png

WPL=2*(7+5+2+4)=36

WPL=3*(7+5)+2*4+2=46

WPL=3*(2+4)+2*5+7=35

1.3、哈夫曼树构造:

(1) 根据给定的n个权值 {w1,w2,......wn}, 生成  n 棵二叉树的集合F= {T1,T2,.......Tm};其中每棵二叉树Ti只有一个带权为Wi的根结点,左右子树为空。

(2) 在 F 中选择两棵根结点值最小的树 Ti ,Tj 作为左右子树,构成一棵新二叉树Tk , Tk根结点值为Ti ,Tj根结点权值之和;

(3) 在 F 中删除Ti ,Tj ,并把 Tk  加到 F中;

(4) 重复 (2) (3),直到 F中只含一棵树。

例:w={7,5,2,4}

b3ab048d0a2339976d65cb70c5ab4719.png

1.4、哈夫曼编码

数据的压缩过程称为编码,解压过程称为解码。

编码:将文件中的字符转换为唯一的一个二进制串。

解码:将一个二进制串转换为对应的字符。

定长编码:设编码字符个数为n,码长为k,则k=上界(log2^(n+1))。

不等长编码:使出现频率最多的字符采用尽可能短的编码。

前缀编码:对不等长编码,要求任一字符的编码都不是另一个字符的编码的前缀。

采用二叉树设计前缀编码:用二叉树的叶结点表示待编码的字符,并约定左分支表示字符‘0’,右分支表示字符‘1’,则从根结点到叶子结点的路径上分支字符组成的字符串作为该叶子结点的编码。由此得到的编码必为二进制的前缀编码。

方法:以n种字符出现的频率作权,设计一棵哈夫曼树,由此得到字符的二进制前缀编码为总长最短的二进制前缀编码,这种编码即为哈夫曼编码。

二、实验实现

2.1、实验内容

哈夫曼编码生成与译码。

输入符号(序号用英文字母A, B, C, …表示)以及各符号出现概率,以字符串形式输出各符号对应的二进制哈夫曼编码。

以字符串形式输入接收到的比特序列,输出译码后的符号序列。建议用菜单形式提供功能。

2.2、输入与输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>