gzip stdin not in gzip format gzip( 三 )


哈夫曼树的应用很广,哈夫曼编码就是其在电讯通信中的应用之一 。广泛地用于数据文件压缩的十分有效的编码方法 。其压缩率通常在20%~90%之间 。在电讯通信业务中,通常用二进制编码来表示字母或其他字符,并用这样的编码来表示字符序列 。
例:如果需传送的电文为 ‘ABACCDA’,它只用到四种字符,用两位二进制编码便可分辨 。假设 A, B, C, D 的编码分别为 00, 01,10, 11,则上述电文便为 ‘00010010101100’(共 14 位),译码员按两位进行分组译码,便可恢复原来的电文 。
【gzip stdin not in gzip format gzip】能否使编码总长度更短呢?
实际应用中各字符的出现频度不相同,用短(长)编码表示频率大(小)的字符,使得编码序列的总长度最小,使所需总空间量最少
数据的最小冗余编码问题
在上例中,若假设 A, B, C, D 的编码分别为 0,00,1,01,则电文 ‘ABACCDA’ 便为 ‘000011010’(共 9 位),但此编码存在多义性:可译为: ‘BBCCDA’、‘ABACCDA’、‘AAAACCACA’ 等 。
译码的惟一性问题
要求任一字符的编码都不能是另一字符编码的前缀,这种编码称为前缀编码(其实是非前缀码) 。在编码过程要考虑两个问题,数据的最小冗余编码问题,译码的惟一性问题,利用最优二叉树可以很好地解决上述两个问题
以电文中的字符作为叶子结点构造二叉树 。然后将二叉树中结点引向其左孩子的分支标 ‘0’,引向其右孩子的分支标 ‘1’; 每个字符的编码即为从根到每个叶子的路径上得到的 0, 1 序列 。如此得到的即为二进制前缀编码 。
编码: A:0,C:10,B:110,D:111
任意一个叶子结点都不可能在其它叶子结点的路径中 。
用哈夫曼树设计总长最短的二进制前缀编码
例:如果需传送的电文为 ‘ABACCDA’,即:A, B, C, D 的频率(即权值)分别为 0.43, 0.14, 0.29, 0.14,试构造哈夫曼编码 。
编码: A:0,C:10,B:110,D:111。电文 ‘ABACCDA’ 便为 ‘0110010101110’(共 13 位) 。
译码
从哈夫曼树根开始,对待译码电文逐位取码 。若编码是“0”,则向左走;若编码是“1”,则向右走,一旦到达叶子结点,则译出一个字符;再重新从根出发,直到电文结束 。
电文为 “1101000” ,译文只能是“CAT”
gzip压缩实践 为提高网页加载速度,启用 gzip 缩减资源的大小是非常常见的手段 。现代浏览器均支持 gzip 压缩,并会为HTTP请求自动协商此类压缩 。
本文将对 gzip 的实践和原理做一个简单的总结 。
web服务器在接收到浏览器的请求之后,会检查浏览器可以接受哪些压缩方法,详情可见下图 。
浏览器在请求头中会带上 Accept-Encoding 这个参数来说明自己支持哪些内容编码方式 。
而服务端返回的 Response Headers 中则存在一个 Content-Encoding ,用来说明数据的压缩方法 。
几乎所有的浏览器都已经支持了 gzip ,并且有请求头的验证,所以基本不需要担心兼容相关的问题 。
压缩前后的体积前后差异,可以在控制台中看到 。可以说,对于js、css文件的压缩率还是比较可观的 。
经过这种方式的配置,在服务端响应请求的时候会对文件进行压缩,之后返回压缩过后的内容 。不过压缩这一过程多多少少会占用一些服务端的性能,具体压缩的程度,也就是 gzip_comp_level 设置的值也会影响到占用性能的多少,接下来我们来看一些网上搜集到的数据,了解不同值的设置对文件大小和CPU占用的影响 。
可以看到,压缩级别从0到1时,文件大小明显减小,CPU消耗略微上涨 。而在之后文件减小的速率明显放缓,在达到了5之后继续增加压缩级别,文件的体积也几乎没有缩小,但CPU消耗却有较为明显的上涨 。
根据结论可以看出,如果是在服务端使用 gzip 压缩的话,考虑到性能和压缩率的取舍,将压缩级别设置为一个较低的值,比如2之类的,是比较合理的 。
我们也可以选择在打包构建项目的时候就对文件进行gzip压缩
这边以打包一个 webpack 的前端项目为例
运行构建命令后可以看到,在生成 .js 和 .css 的同时还生成了对应的 .gz 文件 。
在这种方式的压缩中,我们完全可以把压缩等级设置为一个比较高的值(默认),毕竟只是略微影响打包的时间,却能获取一个更小的体积的包,还是比较值得的 。
以 nginx 为例,静态压缩需要使用 http_gzip_static_module 这个模块,这个模块不是默认的,应使用 --with-http_gzip_static_module 的配置参数启用它

秒懂生活扩展阅读