构造哈夫曼树以及求哈夫曼编码、树的带权路径长度

 我们先搞清楚这几个概念

 构造哈夫曼树的方法

 

将每种字符出现的频率先收集起来放在最上方,然后选择两个频率最小的增加到图中,并将他们的和作为他们的父节点,增加到图中,在最上方删除选择的两个节点(4和2),并添加他们的父节点6到最上方中

 

 

 选择最上方当前两个最小的节点6和5,作为子节点构造得到他们的父节点5+6=11,在最上方删除5和6,增加11

 选择最上方当前两个最小的节点7和9,作为子节点构造得到他们的父节点7+9=16,在最上方删除7和9,增加16

  选择最上方当前两个最小的节点11和16,作为子节点构造得到他们的父节点11+16=27,在最上方删除11和16,增加27

 

 最终得到的这个图就是构造正确的 哈夫曼树

 我们来看第二问  求出每个字符的哈夫曼编码

在题目中找到字符

a对应的频率是4 b对应的频率是7 c对应的频率是5 d对应的频率是2 e对应的频率是9

在原来的哈夫曼树中,左子树的边都赋值为0,右子树的边都赋值为1,从顶点27出发,沿着边寻找每个字符对应的频率,沿着边的足迹就是每个字符对于的哈夫曼编码值     结果如上图所示

第三问叫 求11000111000101011的对应电文,根据左图寻找每串数字对应字母的哈夫曼编码,互相比较得到结果

 第四问叫求带权路径长度

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

这里左下方的5是这个树的一个叶节点(靠近树最外边缘的节点),他距离顶点27的边有2条(5—11和11—27)。  5叶节点的权值是5 乘边数 2  即(5*2)其他节点 以此类推,所有之和就是这个数的带权路径长度

 我们来看一道例题

 

 这个是他构造出来的哈夫曼树

 

 

 

 

 

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈夫曼树是一种用于数据压缩的形结构,它通过将现频率较高的字符用较短的编码表示,从而实现数据的高效压缩。下面是带权路径长度哈夫曼树的代码实现: ```python class Node: def __init__(self, weight, value): self.weight = weight self.value = value self.left = None self.right = None def huffman_tree(weights): nodes = [Node(weight, value) for weight, value in weights] while len(nodes) > 1: nodes.sort(key=lambda x: x.weight) left = nodes.pop(0) right = nodes.pop(0) parent = Node(left.weight + right.weight, None) parent.left = left parent.right = right nodes.append(parent) return nodes def get_codes(root, prefix="", codes={}): if root: if not root.left and not root.right: codes[root.value] = prefix get_codes(root.left, prefix + "0", codes) get_codes(root.right, prefix + "1", codes) return codes # 示例用法 weights = [(5, 'A'), (9, 'B'), (12, 'C'), (13, 'D'), (16, 'E'), (45, 'F')] root = huffman_tree(weights) codes = get_codes(root) for value, code in codes.items(): print(f"{value}: {code}") ``` 上述代码中,我们首先定义了一个`Node`类来表示哈夫曼树的节点,每个节点包含权重和值,并且有左子节点和右子节点。然后,我们使用给定的权重列表构建哈夫曼树。在构建过程中,我们不断选择权重最小的两个节点,合并它们成为一个新的父节点,并将父节点放回节点列表中,直到只剩下一个根节点。 接下来,我们定义了一个`get_codes`函数来递归地获取每个字符的编码。在遍历过程中,我们使用前缀字符串来表示路径,左子节点对应编码为"0",右子节点对应编码为"1"。当遍历到叶子节点时,将叶子节点的值和对应的编码存入字典中。 最后,我们给了一个示例用法,通过给定的权重列表构建哈夫曼树,并获取每个字符的编码。你可以根据自己的需修改权重列表来进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值