山东大学软件学院数据结构课程设计第三题

本文详细探讨了山东大学软件学院数据结构课程设计的第三题,涵盖了相关算法设计、实现难点及解决方案,旨在帮助学生深入理解数据结构的应用。
摘要由CSDN通过智能技术生成

问题描述

    利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。

基本要求

一个完整的系统应具有以下功能:

(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
#
引入正则表达式处理包

#新建哈夫曼树类
class Hafftree:
   
def __init__(self,weight):
       
self.leftchild=None
       
self.rightchild=None
       
self.parent=None
       
self.weight=weight

#
排序方法,使用的是冒泡排序
def sort(list,start,number):
   
if list[start]==0:
       
return
    for
i in range(1,number-1):
       
for j in range(start,number-i):
           
if list[i].weight>list[i+1].weight:
                temp=list[i]
                list[i]=list[i+
1]
                list[i+
1]=temp
           
else:
               
continue

#
初始化一个具有20个空间的哈夫曼数组
li=[Hafftree(0)]*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值