Hello,我又来了,今天给大家分享一个文字压缩方式,这段代码实现了Huffman编码的压缩和解压缩过程。Huffman编码是一种被广泛使用的数据压缩算法。
首先,这段代码定义了一个名为HuffmanNode的类,用于表示Huffman树中的节点。每个节点包含一个字符和该字符在文本中出现的频率,以及左右子节点。__lt__方法用于定义节点之间的比较规则,使得节点可以根据频率进行排序。
build_huffman_tree(text)函数接受一个文本字符串作为输入,首先统计每个字符的频率,然后根据频率创建叶子节点,并将这些节点加入到一个堆中。接着从堆中取出频率最小的两个节点,合并它们,并将合并后的节点放回堆中。这个过程重复进行,直到堆中只剩下一个节点,这个节点就是Huffman树的根节点。
build_encoding_table(node, code='', encoding_table={})函数用于构建一个编码表。这个函数会递归地遍历Huffman树的每个节点,对于每个节点,如果它有字符,就将它添加到编码表中,然后继续遍历它的左右子节点,对每个子节点,将当前编码加上'0'或'1',然后继续递归。
compress_text(text)函数接受一个文本字符串作为输入,首先构建Huffman树和编码表,然后遍历原始文本的每个字符,使用编码表将其转换为对应的Huffman编码,然后将这些编码拼接起来,得到压缩后的文本。
最后,代码接受用户输入的文本字符串,调用compress_text(text)函数进行压缩,并输出压缩后的文本和编码表。
我们先把模块下载下来
pip install collections
pip install heapq
接下来就是代码的操作:
#导入模块
from collections import Counter
import heapq
class HuffmanNode:
def __init__(self, char, freq):
self.char = char
self.freq = freq
self.left = None
self.right = None
def __lt__(self, other):
return self.freq < other.freq
def build_huffman_tree(text):
# 统计字符频率
freq_counter = Counter(text)
# 创建叶子节点
nodes = [HuffmanNode(char, freq) for char, freq in freq_counter.items()]
# 构建Huffman树
heapq.heapify(nodes)
while len(nodes) > 1:
left = heapq.heappop(nodes)
right = heapq.heappop(nodes)
parent = HuffmanNode(None, left.freq + right.freq)
parent.left = left
parent.right = right
heapq.heappush(nodes, parent)
return nodes[0]
def build_encoding_table(node, code='', encoding_table={}):
if node is None:
return
if node.char is not None:
encoding_table[node.char] = code
build_encoding_table(node.left, code + '0', encoding_table)
build_encoding_table(node.right, code + '1', encoding_table)
return encoding_table
def compress_text(text):
# 构建Huffman树
root = build_huffman_tree(text)
# 构建编码表
encoding_table = build_encoding_table(root)
# 压缩文本
compressed_text = ''
for char in text:
compressed_text += encoding_table[char]
return compressed_text, encoding_table
text = str(input("请输入文字:"))
compressed_text, encoding_table = compress_text(text)
print("Compressed Text:", compressed_text)
print("Encoding Table:", encoding_table)
好了,今天就到这吧,取码吱一声哦,家人们