- 需求分析
@1:编码实现哈夫曼树,然后根据数据建立哈夫曼树,然后显示所有的字符的哈夫曼编码
@2:实现哈夫曼编码和解码 并通过编码实现文本文件的压缩 通过解码实现压缩文件的解压缩
- 概要设计
@1:在二叉树的基础上实现哈夫曼树的数据结构
@2:读取文本文件-->对字符频度进行统计-->构建哈夫曼树-->进行哈夫曼编码-->通过哈夫曼编码将文本文件压缩输出到压缩文件中
- 详细设计
@1:哈夫曼树的实现以及哈夫曼编码:
哈夫曼树的是是实现思路:
给定一个字符集合,统计字符出现的频率,并按照频率从小到大排序。取出频率最小的两个字符,将它们作为叶子节点构建一棵二叉树(可以使用任意一种二叉树表示方式,比如孩子兄弟表示法)。以该二叉树为基础,再次取出频率最小的两个字符,将它们添加到这棵二叉树中(作为兄弟或者作为父节点的左右孩子),得到一棵较大的二叉树。重复上述步骤,直到所有字符都被添加到二叉树中。此时,生成的二叉树即为哈夫曼树。根据哈夫曼树的构建规则,左子树代表频率较小的字符,右子树代表频率较大的字符。对于每一个叶子节点,记录其路径所代表的二进制编码即为该字符的哈夫曼编码。
@2:哈夫曼编码器和解码器是实现文本文件的压缩和解压缩
编码器实现压缩文件:
压缩原理:字符频度越大的字符的哈夫曼编码越短 那么就可以用哈夫曼编码来替换原字符的编码 从而实现解压缩,大致如下图:
压缩的流程:
首先一个字符一个字符的读取待压缩文件 统计字符的种数以及字符出现的频度
为了解压缩时重构哈夫曼树 所以此时要将字符的出现的字符种数,字符以及相应的频度写入待压缩文件 然后紧接着写入压缩文件的长度
然后根据字符以及字符频度创建哈夫曼树 进行哈夫曼编码
然后以二进制的方式一个一个字节地遍历待压缩文件 准备一个中间空字符tempchar和计数器num 匹配每个字节对应的哈夫曼编码
然后通过遍历哈弗编码进行位操作每遍历一位哈夫曼编码就将tempchar左移一位 num自增1 如果当前哈夫曼编码是1就将tempchar|1 ,当num=8的时候将tempchar写入压缩文件 ,然后将tempchar 和num复原继续遍历哈夫曼编码,直到遍历完待压缩文件,如果最后的哈夫曼编码不足8位那么就在后面补0 补齐8位
解压缩流程:
首先从压缩文件种读取字符以及字符频度重构哈弗曼树 然后读取文件长度并记录
然后一个字节一个字节地遍历压缩文件之后的字符 ,从根节点出发,并且对每个字节的每一位通过位运算遍历 如果是1 移动到有孩子 如果是0就移动到左孩子 只要判断移动到了叶子结点 就将叶子节点对应的字符写入到解压缩之后的文件中,
项目效果演示:
主界面:
功能1展示:
功能2展示:
功能3展示