无论是做研究还是实际工作,都需要经过长期的积累,才能深刻理解存在的问题、解决方法、瓶颈所在、突破方向等等。

今天和大家聊一下压缩算法相关的知识点!

1.压缩算法的理论基础

任何适用于工程的算法都有它的数学和信息学理论基础。

就如同我们写论文要先做仿真,理论给实践提供了一定的方向和依据。

对于压缩算法来说,我们肯定会问:这是压缩极限了吗?还有提升空间吗?

1.1 信息学之父

聊到这里,不得不提到信息学之父克劳德·艾尔伍德·香农,来简单看下他的履历简介:

克劳德·艾尔伍德·香农(Claude Elwood Shannon ,1916年4月30日—2001年2月24日)是美国数学家、信息论的创始人。

1936年获得密歇根大学学士学位,1940年在麻省理工学院获得硕士和博士学位,1941年进入贝尔实验室工作,1956年他成为麻省理工学院客座教授,并于1958年成为终生教授,1978年成为名誉教授。

香农提出了信息熵的概念,为信息论和数字通信奠定了基础,他也是一位著名的密码破译者。他在贝尔实验室破译团队主要追踪德国飞机和火箭。

相关论文:1938年的硕士论文《继电器与开关电路的符号分析》,1948年的《通讯的数学原理》和1949年的《噪声下的通信》,1949年的另外一篇重要论文《Communication Theory of Secrecy Systems》。

看完这段介绍,我感觉自己被秒成了粉末了,只能默默打开了网抑云,生而为人,我很遗憾。

1.2 信息熵entropy

熵本身是一个热力学范畴的概念,描述了一种混乱程度和无序性。

这是个特别有用的概念,因为自然界的本质就是无序和混乱。

举个不恰当的例子,我们经常看娱乐圈八卦新闻的时候,会说信息量很大,上热搜了等等,那么我们该如何去度量信息量呢?

前面提到的信息学之父香农就解决了信息的度量问题,让一种无序不确定的状态有了数学语言的描述。

在1948年的论文《A Mathematical Theory of Communication》中作者将Entropy与Uncertainty等价使用的。

文中提出了信息熵是信息的不确定性(Uncertainty)的度量,不确定性越大,信息熵越大。

论文地址:http://people.math.harvard.edu/~ctm/home/text/others/shannon/entropy/entropy.pdf

在论文的第6章给出信息熵的几个属性以及信息熵和不确定性之间的联系:

简单翻译一下:

  • 信息熵是随着概率连续变化的;

  • 如果构成事件的各个因素的概率相等,那么信息熵随构成因素总数n的增加而增加,即选择越多,不确定性越大。

  • 当一个选择可以分解为两个连续选择时,分解前后的熵值应该相等,不确定性相同。

我们假设一个事件有多种可能的选择,每个选择的概率分别记为p1,p2....pn,文章进一步给出了概率和信息熵的公式:

其中k为一个正常量。

经过前面的一些分析,我们基本上快懵圈了,太难了。

所以,我们暂且记住一个结论:信息是可度量的,并且和概率分布有直接联系。

2. 数据压缩的本质

既然有了理论的支持,那么我们来想一想 如何进行数据压缩呢?

数据压缩可以分为:无损压缩和有损压缩。

  • 无损压缩 适用于必须完整还原原始信息的场合,例如文本、可执行文件、源代码等。

  • 有损压缩,压缩比很高但无法完整还原原始信息,主要应用于视频、音频等数据的压缩。

2.1 数据压缩的定义

压缩的前提是冗余的存在,消除冗余就是压缩,用更少的信息来完整表达信息,来看下百科的定义:

数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,

需要按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。

举几个简单的例子:

  • "北京交通大学的交通信息工程及控制专业不错"  和 "北交的交控专业不错"

在上述文本中"北京交通大学"可以用"北交"代替,"交通信息工程及控制专业"可以用"交控专业"代替。

  • "aaaaaaaaxxxxxxkkkkkkzzzzzzzzzz" 和 "8a6x6k10z"

在上述文本中有比较明显的局部重复,比如a出现了8次,z出现了10次,如果我们在分析了输入字符的分布规律之后,确定了"重复次数+字符"的规则,就可以进行替换了。

2.2 概率分布和数据编码

本质上来说,数据压缩就是找到待压缩内容的概率分布,再按照一定的编码算法,将那些出现概率高的部分代替成更短的形式。

所以输入内容重复的部分越多,就可以压缩地越小,压缩率越高,如果内容几乎没有重复完全随机,就很难压缩。

这个和我们平时优化代码性能的思路非常相似,热点代码的优化才能带来更大的收益。

2.3 数据压缩极限

前面提到了,用较短的字符串来替换较长的字符串就实现了压缩,那么如果对每次替换都使用最短的字符串,应该就可以认为是最优压缩了。

所以我们需要找到理论上的最短替换串的长度,换到二进制来说就是二进制的长度,这样就可以接近压缩极限了。

我们来分析一下:

  • 抛硬币 只有正面和反面 两种情况 因此使用1位二进制 0和1 就可以

  • 篮球比赛 存在胜/负/平 三种情况 因此需要使用2位二进制 00胜 01负 10平

  • 猜生日月份 存在1-12月 12种情况 因此需要使用4位二进制 来表示各个月份

  • 如果可能性有n个不同的值,那么替换串就需要log2(n)个二进制位来表示

假定内容由n个部分组成,每个部分出现概率分别为p1、p2、...pn,那么替代符号占据的二进制最少为:

log2(1/p1) + log2(1/p2) + ... + log2(1/pn) = ∑ log2(1/pn)

可能的情况越多,需要的二进制长度可能就越长,对于n相等的两个文件,概率p决定了这个式子的大小:

  • p越大,表明文件内容越有规律,压缩后的体积就越小;

  • p越小,表明文件内容越随机,压缩后的体积就越大。

举例:有一个文件包含A, B, C个三种不同的字符,50%是A,30%是B,20%是C,文件总共包含1024个字符,每个字符所占用的二进制位的数学期望为:

0.5*log2(1/0.5) + 0.3*log2(1/0.3) + 0.2*log2(1/0.2)=1.49

求得压缩后每个字符平均占用1.49个二进制位,理论上最少需要1.49*1024=1526个二进制位,约0.1863KB,最终的压缩比接近于18.63%。

3. 霍夫曼编码简介

哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

霍夫曼编码使用变长编码表对源符号进行编码,其中变长编码表是通过评估源符号出现的几率得到的。

出现几率高的字母使用较短的编码,出现几率低的字母使用较长的编码,这使得编码之后字符串的总长度降低。

3.1 前缀编码

霍夫曼编码除了使用变长码之外,还使用前缀编码来确保解码时的唯一性,举个例子:

A-0 C-1 B-00 D-01 则编码后为:000011010

当我们对它进行解码的时候,会发现 0000 可能对应多种解码方式,如 AAAA、AAB、ABA、BB。

霍夫曼树中叶子节点之间不存在父子关系,所以每个叶子节点的编码就不可能是其它叶子节点编码的前缀,这是非常重要的。

3.2 霍夫曼树简单构造

霍夫曼树是霍夫曼编码的重要组成部分,我们拿一个具体的例子来看下霍夫曼树的一点特性。

  • 输入数据:"boob is bee boy"

  • 字符串集合和频次统计

    • 集合 {b,o,s,i,e,y}

    • 频次 {b:4,o:3,e:2,i:1,y:1,s:1}

  • 总计有6个字符,因此需要3位二进制

  • 按照频率越高字符越短&前缀编码规则进行处理

    • b:00

    • o:01

    • e:100

    • i:101

    • y:110

    • s:111

    • 注意:e并不是001,因为这样不符合前缀编码 b是e的父节点

霍夫曼编码的原理和实现还是比较复杂的,篇幅有限,后面单独写一篇文章详细介绍。

4. 本文小结

本文对数据压缩进行了简要的介绍,说明了数据压缩的本质和算法的基本原理,以及霍夫曼树的一些原理。

数据压缩和分析内容的概率分布以及编码有直接的关系,但是各个场景下输入内容的侧重点会有所不同,利用机器学习来处理数据压缩也是当前的一个热门话题。

篇幅有限,后续会重点展开一些细节,这篇就算抛砖引玉开头篇了。

5. 推荐阅读

[加] 伊姆兰·艾哈迈德(Imran Ahmad)著

致力于利用算法求解实际问题

帮助初学者理解算法背后的逻辑和数学知识

推荐语:算法一直在计算科学和计算实践中发挥着重要作用。除了传统计算之外,使用算法解决现实问题的能力是开发人员和程序员必须具备的一项重要技能。本书不仅能帮助你拓展技能,选择强有力的算法解决现实世界的问题,还能帮助你了解算法原理。

本书内容丰富,涉及算法基础、设计技术、分析方法、排序算法、查找算法、图算法、线性规划算法、机器学习算法、推荐算法、数据算法、密码算法和并行算法等内容,重点讲述如何使用Python进行算法实现和算法性能的比较与分析。

更多精彩回顾

书讯 | 2月书讯(下)| 新年到,新书到!

书讯 | 2月书讯 (上)| 新年到,新书到!

资讯 | 重磅!达摩院发布2022十大科技趋势

书单 | 6本书,读懂2022年最火的边缘计算

干货 | 前端应用和产品逻辑的核心:交互流

收藏 | Three.js 的 3D 粒子动画:群星送福

上新 | 【新书速递】如何高效学习存储系统?一本书全都讲明白

浅谈压缩算法的那些事儿相关推荐

  1. 关于密码的那些事儿—浅谈密码的设计与管理

    这是整理于2011年底的一份报告材料. 介绍1.背景 2011年底,国内遭遇网络安全的"崩盘".从CSDN用户数据被爆库,到天涯用户信息被刷库,到众多社交网站.论坛用户数据被拖库, ...

  2. 浅谈Linux内存管理那些事儿

    linux相关视频解析: 5个方面分析linux内核架构,让你对内核不再陌生 手把手带你实现一个Linux内核文件系统 1 前言 内存管理是Linux内核中非常重要的部分,今天和大家一起学习一下. 当 ...

  3. 浅谈爬虫 《一》 ===python

    浅谈爬虫 <一> ===python  ''正文之前先啰嗦一下,准确来说,在下还只是一个刚入门IT世界的菜鸟,工作近两年了,之前做前端的时候就想写博客来着,现在都转做python了,如果还 ...

  4. 浅谈 Linux 高负载的系统化分析

    简介: 浅谈 Linux 高负载的系统化分析,阿里云系统组工程师杨勇通过对线上各种问题的系统化分析. 讲解 Linux Load 高如何排查的话题属于老生常谈了,但多数文章只是聚焦了几个点,缺少整体排 ...

  5. 【转载】浅谈思维教育 朱云龙

    浅谈今日学堂的思维教育(上):思维是什么? 思维教育一直是今日学堂的教学重点.也是我们区别于一般学校的关键所在.很多家长和教育界人士想把这块"宝藏"挖到手.但无论是研究山长的教育理 ...

  6. 浅谈IT企业人力资源流失现状与对策

    浅谈IT企业人力资源流失现状与对策 [摘要] "跳槽"现象已经变得越发的普遍,成为一种司空见惯的行为.对于技术含量较高,具有很大的发展潜力的IT行业来说,一直面临着人才流失,人员流 ...

  7. 浅谈一个新人的大数据之路

    CCCCCold丶大数据之禅 第一章,大数据之路浅谈 数仓&数据集市&数据湖 数据模型 模型ETL频率: 模型存储技术: 模型数据分层: 模型架构分层: 模型主题域: 模型创建类型: ...

  8. 浅谈Google认证失败项分析

    https://www.cnblogs.com/houser0323/p/14002924.html 标签:Google认证.GMS认证.XTS失败项分析.Android.cts 作者:秋城 http ...

  9. 科普 | 浅谈基因检测

    "那开始了吧!" "首先,直奔主题. 什么是基因检测? 基因检测是一种医学检测,即检测你的基因型或者基因是有没有发生异常. Over!" "完了?&q ...

最新文章

  1. 什么叫安装文件索引服务器,搜出精彩 玩转Windows 2008系统心得
  2. directx 双缓冲 运动 闪烁_24期0利率 | BMW超值福袋开启“双11”购车狂欢节!!
  3. Oracle教程之四招提高Oracle位图索引的使用效果
  4. 怀旧服野外pvp最多的服务器,魔兽怀旧服:最想要去的服务器,野外PVP很“传统”,很欢乐!...
  5. 自己动手实现简易代码生成器、采用文本模板文件生成服务层、服务层接口代码的做法参考...
  6. tensorflow基本概念
  7. delete from表名和truncate table 表名的区别
  8. date js 半年_JavaScript Date对象
  9. Eureka服务注册中心---SpringCloud
  10. SharePoint2007安装图文详解二:安装AD(活动目录)及DNS
  11. Objective-C优缺点
  12. mysql: order by, group by ,having, select, where 执行 顺序
  13. python模拟内置函数all_python内置函数all和any
  14. 成都Uber优步司机奖励政策(3月1日)
  15. 判断iOS机器是否支持TouchId, FaceId
  16. 关于MyDockFinder
  17. 小米造车follow苹果路线?智能驾驶能力是个关键问题
  18. 玉米社:短视频脚本是什么意思?包含哪些内容?
  19. 国务院发展研究中心发布《中国云计算产业发展与应用白皮书》| 附下载
  20. 2. C语言 -- 打印

热门文章

  1. 梳理轻量级建模软件Silo中的所有操作(1):创建
  2. Ace(在线代码编辑器)介绍、使用
  3. id文本框适应文字_id文本框适应文字_科普贴士 | 必会的12个Word文字处理技巧,太实用了!...
  4. 自动驾驶决策规划算法概述
  5. 使用docker安装mysql5.7并映射到主机
  6. MobileNetV1《MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications》
  7. History 历史记录
  8. 闽商蔡文胜:磁带、域名、美图的50亿美元进阶
  9. ssm毕设项目校园二手交易平台nip58(java+VUE+Mybatis+Maven+Mysql+sprnig)
  10. PHP控制反转和依赖注入的理解(通俗易懂)