问题描述 利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。 基本要求 一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小n及n个字符和m个权值,建立哈夫曼树,并将它存于文件hfmtree中。 (2)C:编码(Coding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读入),对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中。 (3)D:解码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。 (4)P:打印代码文件(Print)。将文件codefile以紧凑格式显示在终端上,每行50个代码。同时,将此字符形式的编码文件写入文件codeprint中。 (5)T:打印哈夫曼树(Tree printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。
|
实现思想/算法描述: 1. 逐行读入权值,并将权值输入每个哈夫曼节点中,再将其送入数组,排序后选出最小的两个节点拿出进行合并,将合并后的节点送入数组,并重新排序,然后以上述步骤循环将最后数组中唯一的节点拿出,也就是所需的哈夫曼树 2. 对于建好的哈夫曼树,只要经过前序遍历,即可读出所需编码,然后将编码倒序排列,新建类Block,用于储存字符和对应权重以及编码,先将字符及权重初始化完毕,按从小到大排列,将编码按长度进行从大到小排列,从而一一对应将编码写入,然后打开文件,将原文读入,进行逐行扫描并遍历Block数组实现所有字符的替换,最后将结果写入编码文件 3. 解码时,同样是对应Block数组,进行循环遍历,将正则表达式匹配的编码译为字符 4. 打印字符时,循环计数即可实现每行定字符数输出 5. 打印哈夫曼树时,对哈夫曼树进行层序遍历,把每一层格式化为字符串,然后逐层输出
python实现代码:
import re #新建哈夫曼树类 |
山东大学软件学院数据结构课程设计第三题
最新推荐文章于 2023-11-20 21:20:12 发布
本文详细探讨了山东大学软件学院数据结构课程设计的第三题,涵盖了相关算法设计、实现难点及解决方案,旨在帮助学生深入理解数据结构的应用。
摘要由CSDN通过智能技术生成