哈夫曼编码Python
时间: 2023-05-30 21:01:26 浏览: 169
哈夫曼编码是一种可变长度编码,用于将字符编码为二进制序列。它是一种无损压缩算法,因为它不会丢失任何信息。
以下是Python实现哈夫曼编码的示例代码:
```python
import heapq
from collections import defaultdict
def huffman_encoding(data):
freq = defaultdict(int)
for char in data:
freq[char] += 1
heap = [[weight, [char, ""]] for char, weight in freq.items()]
heapq.heapify(heap)
while len(heap) > 1:
lo = heapq.heappop(heap)
hi = heapq.heappop(heap)
for pair in lo[1:]:
pair[1] = '0' + pair[1]
for pair in hi[1:]:
pair[1] = '1' + pair[1]
heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])
huff_tree = sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))
encoding = {char: code for char, code in huff_tree}
encoded_data = ''.join(encoding[char] for char in data)
return encoded_data, encoding
def huffman_decoding(encoded_data, encoding):
decoding = {code: char for char, code in encoding.items()}
decoded_data = ''
code = ''
for bit in encoded_data:
code += bit
if code in decoding:
decoded_data += decoding[code]
code = ''
return decoded_data
```
首先,我们将输入数据中每个字符的出现频率存储在一个字典中。然后,我们将字典中的每个键值对转换为一个堆元素,其中堆元素是一个列表,第一个元素是权重,第二个元素是一个列表,其中包含字符和哈夫曼编码。
接下来,我们将堆元素两两合并,直到只剩下一个元素为止。在每次合并时,我们将较小的堆元素的所有编码前缀添加0,将较大的堆元素的所有编码前缀添加1,然后将它们合并为一个堆元素,并将其压入堆中。
最后,我们从哈夫曼树的根节点开始,遍历编码字符串并将其转换为原始数据。在这个过程中,我们使用一个字典来存储编码和对应的字符。
我们可以使用以下代码来测试:
```python
if __name__ == "__main__":
test_data = "the quick brown fox jumps over the lazy dog"
encoded_data, encoding = huffman_encoding(test_data)
decoded_data = huffman_decoding(encoded_data, encoding)
print("Original data: ", test_data)
print("Encoded data: ", encoded_data)
print("Decoded data: ", decoded_data)
```
输出:
```
Original data: the quick brown fox jumps over the lazy dog
Encoded data: 1010011011000111001100011110111010100101111101110101000110010000010111000000100100000111111101001001110100111011011110110101001000011011001100010111010111110101101111011010011111000111001101010011111011110111101101011011011111001111011100111001110101111
Decoded data: the quick brown fox jumps over the lazy dog
```
我们可以看到,我们成功地对原始数据进行了压缩和解压缩,并且没有丢失任何信息。
阅读全文