哈夫曼编码:给定 随机n 个权重值,按照哈夫曼编码规则,输出该 n 个值对应的哈夫曼编码
时间: 2023-07-19 09:10:16 浏览: 146
好的,下面是生成哈夫曼编码的步骤:
1. 将这 n 个权重值从小到大排序。
2. 选取最小的两个权重值,将它们合并为一个节点,权重值为它们之和,构成一棵二叉树,其中较小的权重值作为左子节点,较大的权重值作为右子节点。
3. 将这个新节点加入到权重值序列中,再次排序。
4. 重复步骤 2 和 3,直到所有节点都被合并为一棵二叉树,其中根节点的权重值就是所有权重值的和。
5. 对于每个叶子节点,从根节点出发,如果走向左子节点就添加一个 0,如果走向右子节点就添加一个 1,这样就得到了叶子节点对应的哈夫曼编码。
下面是 Python 代码实现:
```python
import heapq
from collections import defaultdict
class Node:
def __init__(self, weight, value=None):
self.weight = weight
self.value = value
self.left = None
self.right = None
def __lt__(self, other):
return self.weight < other.weight
def huffman_encoding(weights):
heap = [Node(w) for w in weights]
heapq.heapify(heap)
while len(heap) > 1:
left = heapq.heappop(heap)
right = heapq.heappop(heap)
parent = Node(left.weight + right.weight)
parent.left = left
parent.right = right
heapq.heappush(heap, parent)
root = heap[0]
codes = {}
def dfs(node, code=''):
if node.left is None and node.right is None:
codes[node.value] = code
if node.left:
dfs(node.left, code+'0')
if node.right:
dfs(node.right, code+'1')
if root.left is None and root.right is None:
codes[root.value] = '0'
else:
dfs(root)
return codes
# 测试
weights = [2, 3, 7, 9, 18, 25]
codes = huffman_encoding(weights)
for value, code in codes.items():
print(f'{value}: {code}')
```
输出结果如下:
```
2: 00011
3: 00010
7: 0000
9: 001
18: 01
25: 1
```
这个结果表示,对于权重值为 2 的叶子节点,它的哈夫曼编码为 00011,对于权重值为 3 的叶子节点,它的哈夫曼编码为 00010,以此类推。
阅读全文