哈夫曼编码及例程

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

压缩过程:

  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)

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

相关推荐
python算法(魔法师版)27 分钟前
基于机器学习鉴别中药材的方法
深度学习·线性代数·算法·机器学习·支持向量机·数据挖掘·动态规划
JNU freshman2 小时前
力扣第435场周赛讲解
算法·leetcode·蓝桥杯
眼镜哥(with glasses)2 小时前
蓝桥杯python基础算法(2-2)——基础算法(B)——模拟(上)
算法
赵鑫亿3 小时前
7.DP算法
算法·dp
iqay3 小时前
【C语言】填空题/程序填空题1
c语言·开发语言·数据结构·c++·算法·c#
还有糕手3 小时前
算法【有依赖的背包】
算法·动态规划
pursuit_csdn4 小时前
力扣 347. 前 K 个高频元素
算法·leetcode
wen__xvn4 小时前
每日一题洛谷B3865 [GESP202309 二级] 小杨的 X 字矩阵c++
c++·算法·矩阵
makabaka_T_T4 小时前
25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表
数据结构·c++·算法·leetcode·链表·矩阵
辞半夏丶北笙5 小时前
最近最少使用算法(LRU最近最少使用)缓存替换算法
java·算法·缓存