写一个关于哈夫曼编码的压缩与解压缩的代码,并给出相应的解释
时间: 2023-11-28 19:47:28 浏览: 94
好的,关于哈夫曼编码的压缩与解压缩代码,我可以给出一个简单的实现,并进行相应的解释。
首先,哈夫曼编码是一种可变长度编码,将频率高的字符用比较短的编码表示,频率低的字符用比较长的编码表示,从而达到压缩数据的目的。具体实现过程如下:
压缩:
1. 统计各个字符的出现频率,构建字符频率表。
2. 构建哈夫曼树,将字符频率表中频率最小的两个字符合并为一个节点,其频率为这两个字符的频率之和。重复该过程,直到所有节点都被合并为一个根节点。合并的过程中需要将字符编码为 0 或 1,编码规则为左孩子节点为 0,右孩子节点为 1。
3. 根据哈夫曼树构建字符编码表,即将每个字符对应的编码保存起来。
4. 遍历压缩文本,将每个字符通过编码表转化为对应的二进制编码,将所有二进制编码合并成一个二进制串,作为最终压缩后的数据。
解压缩:
1. 根据哈夫曼编码表和压缩后的二进制串,将二进制串按照编码表逐个解码为对应的字符,得到原始字符流。
下面具体给出 Python 代码实现:
```python
import heapq
import collections
import itertools
import sys
class Node:
def __init__(self, freq, char=None, left=None, right=None):
self.freq = freq # 出现频率
self.char = char # 字符
self.left = left # 左子节点
self.right = right # 右子节点
def __lt__(self, other):
return self.freq < other.freq
def huffman_encoding(data):
# 统计字符频率
freqs = collections.Counter(data)
if not freqs:
return "", None
# 构建哈夫曼树
nodes = [Node(freq, char) for char, freq in freqs.items()]
heapq.heapify(nodes)
while len(nodes) > 1:
left = heapq.heappop(nodes)
right = heapq.heappop(nodes)
node = Node(left.freq + right.freq, left=left, right=right)
heapq.heappush(nodes, node)
root = nodes[0]
# 构建字符编码表
codes = {}
def build_code(node, code=''):
if node.char is not None:
codes[node.char] = code
else:
build_code(node.left, code + '0')
build_code(node.right, code + '1')
build_code(root)
# 将文本编码为二进制串
encoded = ''.join(codes[char] for char in data)
return encoded, root
def huffman_decoding(encoded, root):
# 将编码转化为二进制数组
bits = itertools.cycle(encoded)
bytes_ = bytes([int(''.join(itertools.islice(bits, 8)), 2) for _ in itertools.count()])
buf = bytearray()
i = iter(bytes_)
for byte in i:
mask = 0b10000000
while mask:
if byte & mask:
root = root.right
else:
root = root.left
if root.char is not None:
buf.append(root.char)
root = nodes[0]
mask >>= 1
return bytes(buf).decode()
if __name__ == '__main__':
# 输入要压缩的字符串
text = input()
# 压缩
encoded, root = huffman_encoding(text)
print("Encoded data:", encoded)
# 解压
decoded = huffman_decoding(encoded, root)
print("Decoded data:", decoded)
```
以上就是一个简单的哈夫曼编码的压缩与解压缩代码及其解释。
阅读全文