程序员需要了解的硬核知识之压缩算法(一)

简介: 之前的文章更多的介绍了计算机的硬件知识,会有一些难度,本篇文章的门槛会低一些,一起来看一下计算机中都有哪些压缩算法

认识压缩算法

我们想必都有过压缩解压缩文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间。比如微信上传文件的限制是100 MB,我这里有个文件夹无法上传,但是我解压完成后的文件一定会小于 100 MB,那么我的文件就可以上传了。

此外,我们把相机拍完的照片保存到计算机上的时候,也会使用压缩算法进行文件压缩,文件压缩的格式一般是JPEG

那么什么是压缩算法呢?压缩算法又是怎么定义的呢?在认识算法之前我们需要先了解一下文件是如何存储的

文件存储

文件是将数据存储在磁盘等存储媒介的一种形式。程序文件中最基本的存储数据单位是字节。文件的大小不管是 xxxKB、xxxMB等来表示,就是因为文件是以字节 B = Byte 为单位来存储的。

文件就是字节数据的集合。用 1 字节(8 位)表示的字节数据有 256 种,用二进制表示的话就是 0000 0000 - 1111 1111 。如果文件中存储的数据是文字,那么该文件就是文本文件。如果是图形,那么该文件就是图像文件。在任何情况下,文件中的字节数都是连续存储的。

46.jpg


压缩算法的定义

上面介绍了文件的集合体其实就是一堆字节数据的集合,那么我们就可以来给压缩算法下一个定义。

压缩算法(compaction algorithm)指的就是数据压缩的算法,主要包括压缩和还原(解压缩)的两个步骤。

其实就是在不改变原有文件属性的前提下,降低文件字节空间和占用空间的一种算法。

根据压缩算法的定义,我们可将其分成不同的类型:

有损和无损

无损压缩:能够无失真地从压缩后的数据重构,准确地还原原始数据。可用于对数据的准确性要求严格的场合,如可执行文件和普通文件的压缩、磁盘的压缩,也可用于多媒体数据的压缩。该方法的压缩比较小。如差分编码、RLE、Huffman编码、LZW编码、算术编码。

有损压缩:有失真,不能完全准确地恢复原始数据,重构的数据只是原始数据的一个近似。可用于对数据的准确性要求不高的场合,如多媒体数据的压缩。该方法的压缩比较大。例如预测编码、音感编码、分形压缩、小波压缩、JPEG/MPEG。

对称性

如果编解码算法的复杂性和所需时间差不多,则为对称的编码方法,多数压缩算法都是对称的。但也有不对称的,一般是编码难而解码容易,如 Huffman 编码和分形编码。但用于密码学的编码方法则相反,是编码容易,而解码则非常难。

帧间与帧内

在视频编码中会同时用到帧内与帧间的编码方法,帧内编码是指在一帧图像内独立完成的编码方法,同静态图像的编码,如 JPEG;而帧间编码则需要参照前后帧才能进行编解码,并在编码过程中考虑对帧之间的时间冗余的压缩,如 MPEG。

实时性

在有些多媒体的应用场合,需要实时处理或传输数据(如现场的数字录音和录影、播放MP3/RM/VCD/DVD、视频/音频点播、网络现场直播、可视电话、视频会议),编解码一般要求延时 ≤50 ms。这就需要简单/快速/高效的算法和高速/复杂的CPU/DSP芯片。

分级处理

有些压缩算法可以同时处理不同分辨率、不同传输速率、不同质量水平的多媒体数据,如JPEG2000、MPEG-2/4。

这些概念有些抽象,主要是为了让大家了解一下压缩算法的分类,下面我们就对具体的几种常用的压缩算法来分析一下它的特点和优劣

几种常用压缩算法的理解

RLE 算法的机制

接下来就让我们正式看一下文件的压缩机制。首先让我们来尝试对 AAAAAABBCDDEEEEEF 这 17 个半角字符的文件(文本文件)进行压缩。虽然这些文字没有什么实际意义,但是很适合用来描述 RLE 的压缩机制。

由于半角字符(其实就是英文字符)是作为 1 个字节保存在文件中的,所以上述的文件的大小就是 17 字节。如图

47.jpg

(这里有个问题需要读者思考一下:为什么 17 个字符的大小是 17 字节,而占用空间却很大呢? 这个问题此篇文章暂不讨论)

那么,如何才能压缩该文件呢?大家不妨也考虑一下,只要是能够使文件小于 17 字节,我们可以使用任何压缩算法。

最显而易见的一种压缩方式我觉得你已经想到了,就是把相同的字符去重化,也就是 字符 * 重复次数 的方式进行压缩。所以上面文件压缩后就会变成下面这样

48.png


从图中我们可以看出,AAAAAABBCDDEEEEEF 的17个字符成功被压缩成了 A6B2C1D2E5F1 的12个字符,也就是 12 / 17 = 70%,压缩比为 70%,压缩成功了。

像这样,把文件内容用 数据 * 重复次数 的形式来表示的压缩方法成为 RLE(Run Length Encoding, 行程长度编码) 算法。RLE 算法是一种很好的压缩方法,经常用于压缩传真的图像等。因为图像文件的本质也是字节数据的集合体,所以可以用 RLE 算法进行压缩


            </div>
目录
相关文章
|
2月前
|
Rust 安全 程序员
Rust 语言的防错机制太惊人了!安全编码从此不再是难题,快来一探究竟!
【8月更文挑战第31天】《安全编码原则:Rust 语言中的防错机制》探讨了代码安全的重要性,并详细介绍了Rust语言如何通过内存安全模型、所有权与借用规则等特性,在编译阶段检测并阻止潜在错误,如缓冲区溢出和悬空指针。文章还讨论了类型安全、边界检查等其他安全特性,并提出了遵循不可变引用、避免裸指针及充分测试等实用编码原则,以进一步提升代码质量和安全性。随着Rust在软件开发中的应用日益广泛,掌握其安全编码原则变得尤为重要。
38 0
|
3月前
|
人工智能 算法 程序员
解码技术的奥秘:我的编程之旅与技术感悟
在数字时代的浪潮中,编程已成为一门艺术和科学的结合体。本文将通过个人经历的视角,探索编程世界的深层次理解,揭示技术发展的脉络,并分享在实践中形成的独到见解。文章旨在为读者提供一种独特的视角,以理解编程不仅仅是代码的堆砌,更是逻辑思维、创造力与持续学习的综合体现。
30 1
|
架构师 Java 程序员
阿里P7架构师,耗时十年整理的Java飞升笔记,差距不是一点点
这个问题就不用假如了,我本身从事Java开发已经十年了,去年因为疫情原因导致公司需要断臂求生,熟悉的那些小伙伴们相继离开,心中五味杂陈,思前想后决定离开这个呆了五年的地方。在猎头的引荐下,最终选择了阿里;
|
存储 算法 小程序
深度剖析数据在内存中的存储(修炼内功~吊打面试官)
深度剖析数据在内存中的存储(修炼内功~吊打面试官)
137 0
深度剖析数据在内存中的存储(修炼内功~吊打面试官)
|
测试技术 Go
字节跳动青训营Day03 - Go语言性能优化建议
在满足正确性、可靠性、健壮性、可读性等质量因素的前提下,设法提高程序的效率 1.slice 预分配内存 在尽可能的情况下,在使用 make() 初始化切片时提供容量信息,特别是在追加切片时 原理 测试程序:
118 0
|
存储 算法 程序员
程序员需要了解的硬核知识之压缩算法(二)
之前的文章更多的介绍了计算机的硬件知识,会有一些难度,本篇文章的门槛会低一些,一起来看一下计算机中都有哪些压缩算法
127 0
程序员需要了解的硬核知识之压缩算法(二)
|
存储 编解码 算法
程序员需要了解的硬核知识之压缩算法(一)
之前的文章更多的介绍了计算机的硬件知识,会有一些难度,本篇文章的门槛会低一些,一起来看一下计算机中都有哪些压缩算法
67 0
程序员需要了解的硬核知识之压缩算法(一)
|
存储 小程序 编译器
【C语言】万字肝爆!建议收藏!深度剖析数据在内存中的存储
数据在内存中到底是怎么存储的呢?相信看完这篇文章你的内功又会增加一点。
191 0
【C语言】万字肝爆!建议收藏!深度剖析数据在内存中的存储
|
存储 缓存 程序员
程序员需要了解的硬核知识之内存(三)
我们都知道,计算机是处理数据的设备,而数据的主要存储位置就是磁盘和内存,并且对于程序员来讲,CPU 和内存是我们必须了解的两个物理结构,它是你通向高阶程序员很重要的桥梁,那么本篇文章我们就来介绍一下基本的内存知识。
90 0
程序员需要了解的硬核知识之内存(三)
|
存储 缓存 程序员
程序员需要了解的硬核知识之内存(一)
我们都知道,计算机是处理数据的设备,而数据的主要存储位置就是磁盘和内存,并且对于程序员来讲,CPU 和内存是我们必须了解的两个物理结构,它是你通向高阶程序员很重要的桥梁,那么本篇文章我们就来介绍一下基本的内存知识。
119 0
程序员需要了解的硬核知识之内存(一)
下一篇
无影云桌面