哈夫曼编码及例程

哈夫曼编码是一种常见的无损压缩算法,通过根据字符出现的频率构建一个最优编码树,将频率较高的字符用较短的编码表示,从而实现数据的压缩。下面是一个简单的例程来演示如何使用哈夫曼编码进行文本数据的压缩和解压缩。

压缩过程:

  1. 统计输入文本中每个字符的出现频率。
  2. 根据字符频率构建哈夫曼树。频率越高的字符离根节点越近。
  3. 根据哈夫曼树生成每个字符的编码,左子树路径上为0,右子树路径上为1。
  4. 使用生成的编码对输入文本中的每个字符进行替换,生成压缩后的二进制数据。

解压缩过程:

  1. 使用相同的字符频率构建哈夫曼树。
  2. 从根节点开始,按压缩数据的每一位依次遍历哈夫曼树。
  3. 如果遇到0,则移动到当前节点的左子树;如果遇到1,则移动到当前节点的右子树。
  4. 当到达叶子节点时,输出对应的字符,并返回根节点继续处理下一位。

以下是一个简单的Python例程,展示了如何使用哈夫曼编码来压缩和解压缩文本数据。

复制代码
import heapq
from collections import defaultdict

class HuffmanNode:
    def __init__(self, char, freq):
        self.char = char
        self.freq = freq
        self.left = None
        self.right = None

def build_frequency_table(data):
    frequency_table = defaultdict(int)
    for char in data:
        frequency_table[char] += 1
    return frequency_table

def build_huffman_tree(frequency_table):
    heap = []
    for char, freq in frequency_table.items():
        node = HuffmanNode(char, freq)
        heapq.heappush(heap, (freq, id(node), node))

    while len(heap) > 1:
        freq1, _, left = heapq.heappop(heap)
        freq2, _, right = heapq.heappop(heap)
        merged_freq = freq1 + freq2
        merged_node = HuffmanNode(None, merged_freq)
        merged_node.left = left
        merged_node.right = right
        heapq.heappush(heap, (merged_freq, id(merged_node), merged_node))

    _, _, root = heapq.heappop(heap)
    return root

def build_encoding_table(root):
    encoding_table = {}

    def traverse(node, code):
        if node.char is not None:
            encoding_table[node.char] = code
        else:
            traverse(node.left, code + '0')
            traverse(node.right, code + '1')

    traverse(root, '')
    return encoding_table

def encode_text(data, encoding_table):
    encoded_data = ''
    for char in data:
        encoded_data += encoding_table[char]
    return encoded_data

def decode_text(encoded_data, root):
    decoded_data = ''
    node = root
    for bit in encoded_data:
        if bit == '0':
            node = node.left
        else:
            node = node.right

        if node.char is not None:
            decoded_data += node.char
            node = root

    return decoded_data

# 示例用法
text = "Hello, world!"
frequency_table = build_frequency_table(text)
huffman_tree = build_huffman_tree(frequency_table)
encoding_table = build_encoding_table(huffman_tree)
encoded_data = encode_text(text, encoding_table)
decoded_data = decode_text(encoded_data, huffman_tree)

print("原始文本:", text)
print("压缩后的数据:", encoded_data)
print("解压缩后的文本:", decoded_data)

这个例程包含了构建频率表、构建哈夫曼树、生成编码表、压缩和解压缩等步骤,可以对输入的文本进行压缩并恢复。

相关推荐
朝新_21 分钟前
【优选算法】第一弹——双指针(上)
算法
艾莉丝努力练剑43 分钟前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
CoovallyAIHub1 小时前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董1 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼1 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
yan8626592461 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
小此方2 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法
_poplar_2 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法
CoovallyAIHub2 小时前
YOLO Vision 2025 还没结束!亚洲首场登陆深圳,YOLO26有望亮相
深度学习·算法·计算机视觉
寂静山林2 小时前
UVa 10447 Sum-up the Primes (II)
算法