哈夫曼编码:基于字符频率实现(0,1)编码及Python代码详解
哈夫曼编码是一种用于无损数据压缩的熵编码算法。其基本思想是:根据字符出现的频率(或概率)构造出一颗二叉树,频率高的字符离根节点越近,频率低的字符离根节点越远。这样,我们可以通过字符在二叉树中的路径来表示该字符,这就是哈夫曼编码。 具体实现过程如下: 1. 首先,我们需要创建一个节点类,每个节点包含字符、频率和左右子节点。 2. 然后,我们根据给定的字符和频率创建所有的叶子节点,并将它们放入一个优先队列(以频率为优先级)。 3. 接下来,我们从优先队列中取出两个频率最小的节点,然后创建一个新的父节点,其频率为这两个节点的频率之和。新节点的左子节点是频率较小的节点,右子节点是频率较大的节点。然后将新的父节点放回优先队列。 4. 我们重复第3步,直到优先队列中只剩下一个节点,这个节点就是哈夫曼树的根节点。 5. 我们通过遍历哈夫曼树,得到每个字符的哈夫曼编码。从根节点开始,向左走标记为0,向右走标记为1,到达叶子节点时,路径上的标记组合起来就是该字符的哈夫曼编码。 以下是对应的Python代码: ```python import heapq from collections import namedtuple class Node(namedtuple("Node", ["left", "right"])): def walk(self, code, acc): self.left.walk(code, acc + "0") self.right.walk(code, acc + "1") class Leaf(namedtuple("Leaf", ["char"])): def walk(self, code, acc): code[self.char] = acc or "0" def huffman_encode(s, frequencies): h = [] for ch, freq in zip(s, frequencies): h.append((freq, len(h), Leaf(ch))) heapq.heapify(h) count = len(h) while len(h) > 1: freq1, _count1, left = heapq.heappop(h) freq2, _count2, right = heapq.heappop(h) heapq.heappush(h, (freq1 + freq2, count, Node(left, right))) count += 1 code = {} if h: [(_freq, _count, root)] = h root.walk(code, "") return code s = ["a","b","c","d","e","f","g","h"] frequencies = [0.07,0.19, 0.02, 0.06, 0.32, 0.03, 0.21,0.1] code = huffman_encode(s, frequencies) for ch in sorted(code): print(f"{ch}: {code[ch]}") ``` 这段代码首先定义了两个类,Node和Leaf,分别代表哈夫曼树的节点和叶子节点。然后定义了一个函数huffman_encode,它接受一个字符串和一个频率列表作为输入,返回一个字典,字典的键是字符,值是对应的哈夫曼编码。我们使用这个函数对给定的字符串和频率进行编码,并打印出结果。 ######[AI写代码神器 | 794点数解答 | 2024-06-19 23:42:13]
- C++实现读取数字并输出最小值的代码及解释(字节豆包 | 113点数解答 | 2026-03-20 19:32:56)5
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)458
- C++实现输出指定奇数阶中间为#的矩形图案(字节豆包 | 380点数解答 | 2026-03-20 19:14:24)4
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)343
- 深度揭秘 Oracle Workarea Size Policy:参数调优助力数据库性能飞升(阿里通义 | 372点数解答 | 2024-05-13 10:54:45)226
- 哈夫曼编码:基于字符频率实现(0,1)编码及Python代码详解(讯飞星火 | 794点数解答 | 2024-06-19 23:42:13)234
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)414
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)405
- C语言:按特定格式输入并格式化输出整数、实数和字符(字节豆包 | 103点数解答 | 2024-10-24 11:12:53)398
- Python 实现按指定字符位置逆序字符串,处理多种边界情况!(字节豆包 | 197点数解答 | 2024-11-22 16:55:09)316
- C++实现n×n图案输出:中间行'#'其余'*',开发需注意三点!(字节豆包 | 265点数解答 | 2026-01-16 19:06:25)49
- Python破解NOIP2015基础扫雷游戏:计算非地雷格周围地雷数(字节豆包 | 545点数解答 | 2026-02-02 17:34:02)49