今年的小学期我选了做哈夫曼编码,老师的要求是这样的:
编—译码系统的设计
内容:
(1) 读入待编码的文字,统计各字符出现的频率
(2) 构造哈夫曼树
(3) 得到各字符的哈夫曼编码
(4) 对原文进行编码
(5) 发送、接收
(6) 还原(译码)收到的文字
(7) 利用哈夫曼树,从根到叶子读0、1序列,直到终止,再读下一个字符
(8) 比较(校验)
基本要求:(85分)
合理设计窗口界面,待编码的文字通过窗口的编辑界面(类似记事本的编辑界面)录入,在界面上显示各个字符出现的频率及哈夫曼编码,对原文编码并在界面上显示出来;对译码文字还原,显示在界面上与原文对照。功能菜单或按钮自行设计,以合理为目的。
扩展要求:(15分)
利用socket进行电文的发送与接收,加5分;
在界面上显示出哈夫曼树及其生成过程,加10分。
在coding的时候主要踩了三个坑,一个是指针问题,另外三个是关于qt的,在上三篇博文中已经列出。
对于系统的设计我将按照老师给的模板来写一下,源码我已经放到了githup,链接我将放在博文最后
任务描述
整个项目分为四个模块,包括哈夫曼编码,哈夫曼译码,动画演示哈夫曼树生成过程,还有socket网络编程传送电文,其中,哈夫曼编码模块主要实现了对要编码的文字的频率统计,然后根据频率进行编码,并将哈夫曼树的类完全前序序列和编码后的文本保存到本地文件中。哈夫曼译码模块主要实现了从文件中读取哈夫曼树的前序序列以及编码后的文本,根据前序序列重构哈夫曼树并用该树完成译码工作。动画演示模块主要实现根据节点的权值进行n-1轮的合并树,模拟了哈夫曼树生成过程。socket网络编程部分主要实现了文件的传输,接收方利用接收的文件重构哈夫曼树并进行译码。
逻辑结构设计
在项目中主要用了树和线性表两种逻辑结构,树中包括了真二叉树和堆。堆用于了哈夫曼树的构建过程,真二叉树用来进行编码,线性表用来存储树中的叶子节点,保存编码信息。
解决的最困难的问题
最困难的是动态模拟树的生成过程,因为首先需要搞懂视图坐标,场景坐标,图形项坐标,三种坐标的关系,还要自定义图形项。在动画中每次都要为各个图形项添加动画,计算合并后位置。
源码网址:
发送端:点击打开链接
接收端:点击打开链接