《程序是怎样跑起来的》第六章

本章主要讲的是自己动手压缩数据。文件是以字节为单位记录的。文件是在磁盘等存储媒体中存储数据的一种形式,程序是以字节为单位向文件中存储数据的文件的大小。之所以表示为xxKB或xxMB等形式,就是出于这个原因。文件是,字节数据的集合体。1字节=8比特,一字节能够表示的字节数据共有256种,也就是二进制数00000000~11111111所表示的范围。存储在文件中的数据,如果表示字符,那这个文件就是一个文本文件,如果表示图案,那这个文件就是一个图片文件,但无论如何,我们都可以认为文件就是一串连续存储的字节数据。
下面我们就来说文件压缩的原理,这里假设我们要对AAAAAABBCDDEEEEEF这个包含17个半角英文字符的文件(文本文件)进行压缩。每个半角英文字符在文件中都占一字节,因此这个文件的大小为17字节。我们可以将文件内容用数据乘以重复次数来表示压缩方法,这种方法我们称为游程编码。不过,在实际的文本文件中,很少有同一个字符,连续多次出现的情况,对于相同数据连续重复的情况较多的图片,文件,流程,编码的效果比较好,但它并不适用于来压缩文本文件。
其实,压缩方式有很多,那么第二种压缩方式,我们称为哈夫曼算法。要理解哈夫曼算法,首先我们需要舍弃1个半角英文数字和符号,占1字节的固有概念,一个文本文件中包含各种各样的字符,但每个字符的出现次数是不同的,例如在一个文本文件中A出现了100次,但Q只出现了3次,这是很普遍的现象,而哈夫曼算法压缩的要点在于我们可以将出现次数多的数据用小于8比特的编码来表示,将出现次数少的数据用大于8比特的编码来表示。如果A和Q都用8比特来表示,那么文件的原始大小就是8比特x100次+8比特x3次=824比特,但如果我们能将A用2比特来表示,将Q用10比特来表示,那么压缩后的数据大小就是2比特x100次+10比特x3次=230比特。为了让我们更好的理解哈夫曼算法,接下来介绍一下莫尔斯码。对于数字世界习以为常的我们,都可能认为莫尔斯码中的短信号代表0,长信号代表1,每个字符用8比特来表示。而在实际的莫尔斯马中,不同字符所使用的编码长度是不同的。
哈弗买算盘的要点是根据不同的压缩对象文件来构建最优的编码系统,并基于这一编码系统来进行压缩,因此具体为哪个数据分配,哪个编码在不同的文件中是不同的。再由哈夫曼算法压缩的文件中,同时保存着哈夫曼编码的信息,以及压缩后的数据。哈夫曼算法使用哈夫曼书来构建编码系统,从而实现了不,用分隔符就能区分字符的编码系统在使用哈夫曼数的情况下,其实每个字符的编码长度不同,不同的字符也能正确分隔开来。
通过哈弗曼算法大幅提高压缩效率,使用哈夫曼数就可以未出现频率较高的数据,赋予长度较短的编码,并且可以准确判断字符之间的分隔。我们在编码时采用了将出现频率最低的数据连接起来的方法,这意味着出现选频率低的数据要到达根需要经过更多分支经过的分支越多,就意味着编码的比特数越多。

posted @   小靖没烦恼  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示