哈夫曼编码:高效的数据压缩方案

news2024/11/24 11:30:25

在计算机科学中,数据的压缩与编码一直是重要的研究领域。哈夫曼编码(Huffman Coding)作为一种常用的数据压缩方法,以其高效的压缩率和广泛的应用而闻名。本文将介绍哈夫曼编码的原理、构建过程以及代码实现,并通过符号展示哈夫曼树的构建过程,以帮助读者深入理解这一优秀的编码方案。

哈夫曼树icon-default.png?t=N6B9http://t.csdn.cn/7yEWa

二叉树原理https://blog.csdn.net/qq_45467165/article/details/132463936?spm=1001.2014.3001.5501

哈夫曼编码原理

哈夫曼编码的核心思想是通过将出现频率较高的字符用较短的二进制编码表示,从而实现对数据的高效压缩。这种编码方式的关键在于构建哈夫曼树,一棵特殊的二叉树,其中叶节点代表字符,其路径上的二进制编码即为字符的编码。构建过程分为以下几个步骤:

  1. 统计每个字符的出现频率,将字符与频率配对,形成字符频率表。
  2. 将字符频率表中的每个字符看作一个独立的节点,并按照频率构建初始森林。
  3. 从森林中选取两个频率最低的节点合并,构建一棵新的二叉树,其根节点的频率为这两个节点频率之和。
  4. 重复步骤3,直到森林中只剩下一棵树,即哈夫曼树。
  5. 在哈夫曼树中,从根节点到每个叶节点的路径上的分支可以分别表示为0和1,形成字符的二进制编码。

哈夫曼树的构建过程

现在,让我们通过符号来展示哈夫曼树的构建过程。考虑以下字符及其出现频率:

字符频率
A5
B9
C12
D13
E16
F45
  • 我们将按照上述步骤逐步构建哈夫曼树:
  • 首先,将每个字符看作独立的节点,并按照频率构建初始森林。
  • A(5)  B(9)  C(12)  D(13)  E(16)  F(45)
    
  • 选取频率最低的两个节点 A(5) 和 B(9),合并它们构建新节点 AB(14)。
  • AB(14)  C(12)  D(13)  E(16)  F(45)
    
  • 继续选取频率最低的两个节点 AB(14) 和 C(12),合并它们构建新节点 ABC(26)。
  • ABC(26)  D(13)  E(16)  F(45)
    
  • 重复上述步骤,合并节点 ABC(26) 和 D(13),构建新节点 ABCD(39)。
  • ABCD(39)  E(16)  F(45)
    
  • 合并节点 ABCD(39) 和 E(16),构建根节点。
   ABCDE(55)
    /     \
ABCD(39)  E(16)
   /  \
A(5)  B(9)

我们可以清楚地看到哈夫曼树是如何逐步构建起来的。树的构建过程中,频率较低的字符会逐渐被合并,形成树的内部节点,而频率较高的字符则位于叶节点,其编码路径较短,实现了高效的编码方案。

代码实现

这里笔者用python写了一个用于构建哈夫曼树和生成字符的编码:

from heapq import heappush, heappop, heapify

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(freq_table):
    heap = [HuffmanNode(char, freq) for char, freq in freq_table.items()]
    heapify(heap)
    
    while len(heap) > 1:
        left = heappop(heap)
        right = heappop(heap)
        merged = HuffmanNode(None, left.freq + right.freq)
        merged.left = left
        merged.right = right
        heappush(heap, merged)
    
    return heap[0]

def generate_huffman_codes(root, prefix="", code_table={}):
    if root is not None:
        if root.char is not None:
            code_table[root.char] = prefix
        generate_huffman_codes(root.left, prefix + "0", code_table)
        generate_huffman_codes(root.right, prefix + "1", code_table)

# 统计字符频率
frequency_table = {'A': 5, 'B': 9, 'C': 12, 'D': 13, 'E': 16, 'F': 45}
# 构建哈夫曼树
huffman_tree = build_huffman_tree(frequency_table)
# 生成哈夫曼编码
huffman_codes = {}
generate_huffman_codes(huffman_tree, code_table=huffman_codes)

print("字符\t频率\t哈夫曼编码")
for char, freq in frequency_table.items():
    print(f"{char}\t{freq}\t{huffman_codes[char]}")

这段代码首先构建了一个简单的哈夫曼树,然后根据哈夫曼树生成了字符的编码。运行代码,你将看到每个字符及其频率和对应的哈夫曼编码。

结论

哈夫曼编码作为一种高效的数据压缩方案,通过构建特殊的二叉树实现了对字符的编码,将出现频率较高的字符用较短的二进制编码表示,实现了数据的高效压缩。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日常Debug之:智子攻陷了我的MCU!!!

环境&#xff1a;AT32F403AVGT7、IAR8.30、J-LINK 现象&#xff1a;定时器中断里遇到 -1 < 0 返回false的情况。如图&#xff1a; 出现了if(-1 > 0){}为True的情况。 尼马&#xff01;&#xff01;&#xff01;是不是被智子监控了呢&#xff1f; 经过分析&#xff1a;…

点亮社交新篇章:探索 WeTalk 新增的头像与群聊功能

目录 引言&#xff1a; 引入头像功能&#xff1a; 头像功能的优势&#xff1a; 引入群聊功能&#xff1a; 群聊功能的优势&#xff1a; 引入头像功能&#xff1a; 查看头像&#xff1a; ​编辑 上传头像&#xff1a; 引入群聊功能&#xff1a; 创建群聊&#xff1a…

scp命令用于Windows和Linux之间复制文件

scp使用 简述Windows和Linux之间复制文件使用示例从本地复制到远程复制文件复制文件夹 从远程复制到本地复制文件复制文件夹 在Linux下&#xff08;从Linux复制到Windows&#xff09;复制文件复制文件夹 在Windows下&#xff08;从Windows复制到Linux&#xff09;复制文件复制文…

Mybatis中的分页查询,以及对于特殊符号的处理

目录 一.分页查询 1.老版本的分页查询 &#xff08;通过工具类BaseDao来实现&#xff09; 2.利用Mybatis实现分页效果 2.1最低级版本&#xff08;利用limit实现&#xff09; 首先在xml定义分页需要的方法 然后在bookbiz实现方法 其次在bookbizImpl继承此方法&#xff0c;并…

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度&#xff0c;就是总共增加的高度 下面是…

YOLOv7-tracker 目标追踪 输入视频帧

参考项目&#xff1a;https://github.com/JackWoo0831/Yolov7-tracker/tree/master github链接&#xff1a;https://github.com/Whiffe/Yolov7-tracker 码云链接&#xff1a;https://gitee.com/YFwinston/Yolov7-tracker 1 项目安装 1.1 环境搭建 平台&#xff1a;AutoDL 选…

学习网络编程No.4【socket编程实战】

引言 北京时间&#xff1a;2023/8/19/23:01&#xff0c;耍了好几天&#xff0c;主要归咎于《我欲封天》这本小说&#xff0c;听了几个晚上之后逐渐入门&#xff0c;在闲暇时间又看了一下&#xff0c;小高潮直接来临&#xff0c;最终在三个昼夜下追完了&#xff0c;哈哈哈&…

Android 11 Display亮灭屏

系统休眠唤醒的时候会涉及到亮灭屏&#xff0c;下面分析下系统&#xff08;高通8155平台&#xff09;Display亮灭屏流程 1. 点亮屏幕 点亮屏幕入口在framework/base/下面LightsService.java&#xff0c;然后通过调用SurfaceControl.java ,最终调用到framework/native下面的Sur…

4.5 TCP优化

TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上&#xff0c;所以要正确使用三次握手的中参数&#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题&#xff0c;主动发起连接的客户端优化相对简单些&#xff0c;而服务端需要监听端口&a…

【算法专题突破】双指针 - 移动零(1)

目录 写在前面 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 写在前面 在进行了剑指Offer和LeetCode hot100的毒打之后&#xff0c; 我决心系统地学习一些经典算法&#xff0c;增强我的综合算法能力。 1. 题目解析 题目链接&#xff1a;283. 移动零 - 力…

26-非父子通信 - provide inject

provide & inject 作用: 跨层级 共享数据 1. 父组件 provide 提供数据 export default{provide () {return {// 普通类型 (非响应式)color: this.color// 复杂类型 (响应式)userInfo: this.userInfo}}} 2. 子 / 孙组件 inject 取值使用 export default {inject: ["…

docker搭建owncloud,Harbor,构建镜像

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 拉取镜像 docker pull owncloud docker pull mysql:5.6 2、安装搭建私有仓库 Harbor 1.下载docker-compose 2.安装harbor 3.编辑 harbor.yml文件 使用./intall.sh安装 4.登录 3、编写Dockerfile制作Web应用系…

优美而高效:解决服务器通信问题

题目背景 在这个问题中&#xff0c;我们面临着一幅服务器分布图。图中的每个单元格可能有服务器&#xff08;标记为1&#xff09;或者没有&#xff08;标记为0&#xff09;。我们的任务是找出能够与至少一台其他服务器进行通信的服务器数量。 算法思路 为了解决这个问题&…

Python使用pyqt5写windows桌面应用实战教程

本篇文章主要讲解,Python使用pyqt5写windows桌面应用的详细实战教程文章,主要涵盖单个界面的布局构建说明,表单构建说明,数据交互构建说明以及可直接开发的简易多界面框架实例构建说明,能够让你很快的了解pyqt在python中的使用和构建方式,快速实现一个简单的windows桌面图…

AI 绘画Stable Diffusion 研究(十五)SD Embedding详解

大家好&#xff0c;我是风雨无阻。 本期内容&#xff1a; Embedding是什么&#xff1f;Embedding有什么作用&#xff1f;Embedding如何下载安装&#xff1f;如何使用Embedding&#xff1f; 大家还记得 AI 绘画Stable Diffusion 研究&#xff08;七&#xff09; 一文读懂 Stab…

【C语言】动态内存管理,详细!!!

文章目录 前言一、为什么存在动态内存分配二、动态内存开辟函数的介绍1.malloc2.calloc3.realloc4.free 三、动态内存开辟中的常见错误1.误对NULL进行解引用操作2.对于动态开辟的空间进行了越界访问3.对于非动态开辟的内存进行了free操作4.只free掉动态开辟内存的一部分5.多次f…

vue2 vue中的常用指令

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 **构建用户界面 ** 的 渐进式 …

Dapper

介绍 dapper是一款轻量级的ORM Dapper 被称为 ORM 之王。 以下是 Dapper 的主要功能&#xff1a; 速度快&#xff0c;性能快。 更少的代码行。 对象映射器。 静态对象绑定。 动态对象绑定。 轻松处理 SQL 查询。 易于处理存储过程。 直接对 IDBConnection 类进行操作&#xf…

Go 语言进阶与依赖管理 | 青训营

Powered by:NEFU AB-IN 文章目录 Go 语言进阶与依赖管理 | 青训营 语言进阶依赖管理测试 Go 语言进阶与依赖管理 | 青训营 GO语言工程实践课后作业&#xff1a;实现思路、代码以及路径记录 语言进阶 Go可以充分发挥多核优势&#xff0c;高效运行 Goroutine是Go语言中的协程…