哈夫曼编码及例程

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

压缩过程:

  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)

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

相关推荐
vortex527 分钟前
算法设计与分析 知识总结
算法
艾莉丝努力练剑43 分钟前
【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(三)
c语言·开发语言·数据结构·学习·算法
ZZZS05161 小时前
stack栈练习
c++·笔记·学习·算法·动态规划
hans汉斯1 小时前
【人工智能与机器人研究】基于力传感器坐标系预标定的重力补偿算法
人工智能·算法·机器人·信号处理·深度神经网络
vortex53 小时前
算法设计与分析:分治、动态规划与贪心算法的异同与选择
算法·贪心算法·动态规划
前端拿破轮3 小时前
🤡🤡🤡面试官:就你这还每天刷leetcode?连四数相加和四数之和都分不清!
算法·leetcode·面试
地平线开发者4 小时前
征程 6|工具链量化简介与代码实操
算法·自动驾驶
DoraBigHead4 小时前
🧠 小哆啦解题记——谁偷改了狗狗的台词?
算法
Kaltistss4 小时前
240.搜索二维矩阵Ⅱ
线性代数·算法·矩阵
轻语呢喃4 小时前
每日LeetCode:合并两个有序数组
javascript·算法