首页 > 编程语言 >《程序是怎样跑起来的》第6章

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

时间:2024-02-18 10:35:04浏览次数:40  
标签:文件 起来 字节 哈夫曼 比特 压缩 程序 字符 怎样

本章节中,主要讲自己动手压缩数据。我们通常使用的压缩方式是以zip为扩展名来压缩的。那么问题来了,在文件中存续数据的基本单位是什么?在doc,zip,txt,这些文件扩展名中,代表压缩文件的是那个 ?BMP格式的图片文件是经过压缩的吗?在Windows计算机经常使用的Shift-JIS编码中,一个半角英文或数字字符需要用几字节的数据来表示?
其实在文件中存续数据的基本单位是字节(1字节=8比特),在doc,zip,txt,这些文件扩展名中,代表压缩文件的是zip,BMP格式的图片文件是没有经过压缩的,在Windows计算机经常使用的Shift-JIS编码中,一个半角英文或数字字符需要用1字节(8比特)的数据来表示(半角英文,数字和符号都是用1字节表示的,汉字等全角字符用2字节表示)(shift-JIS是一种常用的日文字符编码方案,中文字符常用编码方案为GB2312,GB18030等)。
WINDOWS中常用的压缩文件扩展名是zip,当我们用电子邮件附件发送较大的文件时,文件就会被压缩,将用数码相机拍摄的照片保存到计算机中时,也会不知不觉的用到GPEG等压缩格式。文件是以字节为单位记录的,文件是字节数据的集合体,1字节(8比特)能够表示的字节数据共有256种,也就是二进制数的00000000~11111111所表示的范围。存储在文件中的数据,如果表示字符,那这个文件就是一个文本文件,如果表示图案,那这个文件就是一个图片文件,但无论如何,我们都可以认为文件就是一连串连续存储的字节数据。接下来我们来说一下游程编码的原理:假设我们要对AAAAAABBCDDEEEEEF,这个包含17个半角英文字符的文件进行压缩,虽然文件的内容没有什么意义,但它非常用来讲解压缩的原理。每个半角英文字符在文件中都占一个字节,因此这个文件的大小为17个字节,至于怎样压缩这个文件用任何方法都可以,只要让压缩后的文件的大小,小于17个字节就行了。嗯,那么就是用字符乘以重复次数来表示文件的内容。我们可以看到,在AAAAAABBCDDEEEEEF这串字符中,一些字符重复出现了多次,如果把重复出现的字符放在后面,就可以将那些表示为A6B2C1D2E5F1 。这样就只有12个字符了,即文件大小为12个字节,相当于原文件的12,除以17约等于70%压缩成功。所以说像这样将文件内容用数据乘以重复次数来表示的压缩方法称为游程编码,游程编码是一种很好压缩的方法。不过,在实际的文本文件中,很少有同一个字符,连续多次出现的情况。对于相同数据出现的情况较多的情况下,游程编码是比较好的,但它不适用于来压缩文本文件。第二种压缩方法是哈夫曼算法,哈夫曼算法是大卫哈夫曼于1952年提出的zip格式,也是使用哈夫曼算法来进行压缩的。要理解哈夫曼算法,我们首先需要舍弃一个半角英文,数字和符号占1字节的固有概念,一个文本文件中包含各种各样的字符,但每个字符出现的次数是不一样的。我们来举个例子,在一个文本文件中,A出现了100次,但Q只出现了三次,这是很普遍的现象。用哈夫曼算法压缩的重点在于,我们可以将出现次数多的数据用小于8比特的编码来表示,将出现次数少的数据用大于8比特的编码来表示,如果A和Q都用8比特来表示,那么文件的原始大小就是8比特100次+8比特3次==824比特,但如果我们能将,A用2比特来表示,将Q用10比特来表示,那么压缩后的数据大小就是2比特100次+10比特3次=230比特。但是但是无论,是不足8比特的数据还是超过8比特的数据,最终都要以8比特为单位存储到文件中,因此磁盘按1字节来单位存储数据的事实是无法改变的。
具体算法就不再一一举了。还有一种是使用树来构建哈夫曼编码。具体就不一一说了。

标签:文件,起来,字节,哈夫曼,比特,压缩,程序,字符,怎样
From: https://www.cnblogs.com/shenchen88-88/p/18018877

相关文章

  • 《程序是怎样跑起来的》第三章的读后感
    又到了每周的读书分享,本篇分享《程序是怎样跑起来的》第三章的读后感。大家可能会认为“万能的计算机是不会出现计算错误的”。但实际上,依然存在程序运行后无法得到正确数值的情况。其中,小数运算就是一个典型的例子。第三章就给我们解释了计算机进行小数运算时出错的原因,在本章中......
  • 《系统是怎样跑起来的》读后感——第四章 熟练使用有棱有角的内存
    1.内存的物理机制很简单内存实际上是一种名为内存IC的电子元件。虽然内存IC包括DRAM、SRAM、ROM等多种形式,但从外部来看,其基本机制都是一样的。内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址(address),来进行数据的读写。V......
  • 《程序是怎样跑起来的》自己动手压缩数据
    一,文件是以字节为单位记录的,文件是字节数据的集合体,文件就是一串连续的字节数据二,游程编码的原理将文件内容用数据成重复次数的方式进行压缩,就是游程编码缺点:对于图片压缩率比较高,对于文本,文件则会增加它的内容,使他文本需内存量更大三,哈夫曼算法哈夫曼算法将出现次数多的数......
  • 《程序是怎样跑起来的》第四章读后感
    计算机是处理数据的机器,而程序负责规定处理步骤和数据结构作为处理对象的数据储存在内存和磁盘里,因此程序员必须能够灵活的使用内存和磁盘。内存的物理结构十分简单,它的本质上是一种名为内存芯片的装置。内存芯片内部有很多能储存8比特数据的容器,只要指定容器的地址就可以对数据进......
  • 《程序是怎样跑起来的》读后感——第三章 计算机进行运算小数时出错的原因
    一、二进制的限制计算机内部所有的信息都是以二进制的形式存储和处理的。然而,并非所有的十进制小数都能被精确地用二进制表示。例如,0.1在十进制中是一个无限循环小数,但在二进制中却无法精确表示,只能进行近似表示。这种差异导致了计算机在运算小数时可能出现误差。二、浮点数表示......
  • 《程序是怎样跑起来的》计算机在计算小数时会出错的原因
    一,原因无法准确表示的值,就只能用近似值来表示计算机能力有限,无法处理无限小数,只能根据变量所对应的数据类型的数,采取四舍五入处理法进行处理。由于二进制为近似数,转化为十进制后与所求值存在误差,它是一种正常的现象。二,浮点数分类:双精度浮点类型有64位单精度浮点类型有32位......
  • 《程序是怎样跑起来的》让内存画方为圆
    一,内存的物理结构1.分类:RAM[可读可写的存储器][需要刷新]ROM[只读不写的存储器][不需要刷新]2.内存的芯片内存的芯片包括电源地址,信号,数据信号和控制信号二,内存的逻辑结构像一栋大楼程序中通过指定的变量的数据类型就可以改变读写物理内存的单位长度,很方便三,用好内存,先从数组开始1......
  • 《程序是怎样跑起来的》内存与磁盘的密切联系
    内存与磁盘的密切联系一,程序必须从硬盘加载到内存中才方可运行二,磁盘缓存内存空间临时存放,从磁盘读取出来的数据可提高磁盘数据的访问速度三,将磁盘当成内存使用的虚拟内存将磁盘的一部分模拟成内存来使用的机制使用方式:将运行页面换入将不运行的页面换出,使一个程序被割成多......
  • 《程序是怎么跑起来的》第四章观后感
    第四章“熟练使用有棱有角的内存”关于这一章,是目前我最感兴趣的一章,因为在编程过程中我经常遇到内存这类的问题,讲述了程序运行时对内存的合理使用与优化,通过深入剖析内存的结构和工作原理,带领读者探索内存管理的重要性以及如何在编程过程中利用内存优化程序性能。这一章节对于程......
  • 《程序是怎样跑起来的》用二进制来理解数据
    一,计算机用二进制处理信息的原因原因:CPU是一种集成电路,计算机内部均由集成电路构成集成电路所有的引脚都有直流电压0v或者加5v两种状态处理信息的单位:最小的单位是比特有一位最基本的单位是字节有八位数据的处理:101110转化为八进制是00101110[在最高位增零,以此类推]......