哈夫曼编码及例程

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

压缩过程:

  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)

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

相关推荐
2zcode6 分钟前
基于MATLAB语音信号变声算法设计与实现
算法·matlab·语音识别·变声算法
满怀冰雪14 分钟前
第14篇-队列与单调队列-解决窗口最值问题的关键结构
java·算法
QiLinkOS17 分钟前
极客精神与商业思维的融合实践(3)
c语言·c++·人工智能·算法·开源协议
bIo7lyA8v19 分钟前
算法设计中的代价函数优化与约束求解的技术8
算法
暖阳华笺22 分钟前
【数据结构与算法】哈希专题
数据结构·c++·算法·leetcode·哈希算法
ceclar12323 分钟前
C#字节流与字符流
算法·c#·.net
大白话_NOI28 分钟前
【洛谷 P1024 】[NOIP2001 提高组] 一元三次方程求解 - 详细分析与C++实现
c++·算法
Matthew_zhu_29 分钟前
P3374 【模板】树状数组 1 题解
算法
随意起个昵称29 分钟前
区间dp-进阶题目1(进阶合并)
c++·算法·动态规划
伶俜6630 分钟前
鸿蒙原生应用实战(四)ArkUI 语音变声器:录音 + 4 种音效 + 音调变换算法
算法·华为·harmonyos