给我注解一篇哈夫曼代码,能够对二进制码进行译码 ,打印编码
时间: 2023-07-19 21:53:50 浏览: 90
哈夫曼编码译码_
好的,以下是一个使用哈夫曼编码进行译码的示例代码,注释已经加上:
```python
from heapq import heappush, heappop, heapify
from collections import defaultdict
# 编码表
def get_codes(tree, prefix=""):
"""
tree: 哈夫曼树
prefix: 编码前缀
"""
# 如果是叶子节点,返回字符和编码
if isinstance(tree, str):
return {tree: prefix}
# 如果是非叶子节点,递归构建编码表
else:
left = get_codes(tree[0], prefix + "0")
right = get_codes(tree[1], prefix + "1")
return {**left, **right}
# 哈夫曼编码解码器
class HuffmanDecoder:
def __init__(self, codes):
self.codes = codes
def decode(self, encoded):
"""
encoded: 哈夫曼编码
"""
result = ""
code = ""
for bit in encoded:
code += bit
if code in self.codes:
result += self.codes[code]
code = ""
return result
# 哈夫曼编码器
class HuffmanEncoder:
def __init__(self, text):
self.text = text
def encode(self):
# 统计字符出现的频率
freq = defaultdict(int)
for char in self.text:
freq[char] += 1
# 构建哈夫曼树
heap = [[weight, [char, ""]] for char, weight in freq.items()]
heapify(heap)
while len(heap) > 1:
lo = heappop(heap)
hi = heappop(heap)
for pair in lo[1:]:
pair[1] = "0" + pair[1]
for pair in hi[1:]:
pair[1] = "1" + pair[1]
heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
# 获取编码表
codes = get_codes(heap[0][1])
# 生成编码串
encoded = ""
for char in self.text:
encoded += codes[char]
return encoded, HuffmanDecoder(codes)
# 测试代码
if __name__ == "__main__":
text = "Hello, World!"
encoder = HuffmanEncoder(text)
encoded, decoder = encoder.encode()
print("Text: ", text)
print("Encoded: ", encoded)
decoded = decoder.decode(encoded)
print("Decoded: ", decoded)
```
其中,`HuffmanEncoder` 类用于将输入的文本进行哈夫曼编码,`HuffmanDecoder` 类用于对哈夫曼编码进行解码。在 `HuffmanEncoder.encode()` 方法中,首先统计字符出现的频率,然后根据频率构建哈夫曼树,再根据哈夫曼树构建编码表,最后生成编码串。在 `HuffmanDecoder.decode()` 方法中,根据编码表对编码串进行解码。
以上代码是 Python 实现的哈夫曼编码与解码器,可以将输入的文本进行编码,并将编码串进行解码。你只需要将文本传递给 `HuffmanEncoder` 类的构造函数,然后调用 `encode()` 方法,即可得到编码串和解码器。最后,将编码串传递给 `HuffmanDecoder` 类的 `decode()` 方法,即可得到原始文本。
阅读全文