优化哈夫曼编码
pascal吧
全部回复
仅看楼主
level 8
徐一凡_exe 楼主
关于哈夫曼编码的优化(打算写成一片大作)(这不是水贴,而是伪技术贴)
我们都知道,哈夫曼编码是一种很牛的东西,任何一个文件,任何一篇文章,只要用了它,就可以“略微甚至大幅缩小”所需的储存空间。因为这个特性,很多压缩软件在使用自己的方法压缩文件之后,都采用哈夫曼编码保存文件,以“将压缩进行到底”。关于哈夫曼编码的原理和应用,详见此网站:http://www.baidu.com
从以上网站中可以看到,哈夫曼编码采用各字符在文件中出现的次数来建立一个树,保存文件时,就将各字符替换为“树根到此字符的路径”,顺便把这棵树也保存进文件头,方便解码。
哈夫曼编码就是一种“将等长编码换为变长编码”的编码。(原谅楼主语文素养不高,这句描述的话应该把哈夫曼编码的本质讲清了吧)
现在,楼主举个例子。有一个句子为:
I'm a pig and you're a pig too.I'm a pig so you're a pig.You're a pig because I'm a pig.
通过你的数学的神奇天赋,你会发现——————————————这句话有88个字节!这是多么吉利的数字呀,这句话也一定是一句吉祥的话。
此句话包含了
(为了方便,楼主将大小写一视同仁了,在实际引用中是万万不可的)
9个“I”,
6个“’”,
3个“M”,
19个空格,
8个“A”,
6个“P”,
6个“G”,
1个“N”,(楼主差点忽略了这个字符)
1个“D”,
3个“Y”,
6个“O”,
4个“U”,
3个“R”,
5个“E”,
1个“T”,
3个“.”,(楼主差点忽略了这种字符)
2个“S”,
1个“B”,
1个“C”,
常识告诉我们,每个字符(字节)有8位(二进制),楼主将他们编码为变长的,而不是8位等长的。怎么编呢?出现次数多的字符,比如空格,编的短一点;出现次数少的,比如“C”,就编的长一点,反正空间也占的少。(楼主就是这么懒)
(大家被英语老师骗了,平均出现次数最多的字符不是“E”,而是空格)
(就如Minecraft中生成最多的矿物不是铁矿石,而是圆石,其次是石头,再是基岩,然后才是铁矿石)
(此处应有掌声)
(扯太远了)
正题来了!
谈优化哈夫曼编码!
你可能会说,哈夫曼编码已是“最优编码”了,不可能再优化。
可是信息学总是在不断进步的。
楼主的优化方法其实已经稍稍脱离了“编码”这一东西,和一个独立的压缩算法有些接近了。
前面说过了,哈夫曼编码是一种“将等长编码换为变长编码”的编码,而楼主的编码是一种“将变长编码换为变长编码”的编码。乍一看,好像这编码啥都没做?好吧,解释一下,“哈夫曼编码”是以“字符”为单位进行编码的,而“楼主编码”是以“字符、词语或短句”为单位进行编码的,其它原理与哈夫曼编码无异,都要建一棵树。
单位不同,有一些地方则还需要改变。
假设这两个编码都是以“单位估分”为依据进行建树的,
则以字符为单位的哈夫曼编码的估分公式如下:
估分=该单位在文件中出现的次数
以字符、词语或短句为单位的楼主编码的估分公式如下:
估分=【(该单位在文件中出现的次数-1)*(该单位的长度)+1】*该单位的长度
这是楼主编码最值得称道的地方。
举一个例子,有一个这样的句子:
I'm a pig and you're a pig too.I'm a pig so you're a pig.You're a pig because I'm a pig.
(如果这句子在其他地方出现过,纯属巧合)
此句话包含了以下单位:
“I'm ”,估分为36,
“a pig”,估分为130,
“ and ”,估分为5,
“you're ”,估分为105,
“ too”,估分为4,
“.”,估分为3,
“ so ”,估分为4,
“ because ”,估分为9,
对比可以发现,楼主编码果然比哈夫曼编码有的一拼。怎么编码?编码原则如下:估分高的单位,比如“a pig”,就编的短一点;估分低的,比如“.”,就编的长一点,反正空间也占的少。
虽看看,楼主编码如此简单实用,但是用程序来进行编码,却异常困难,光是用“贪心加枚举”来获取各个单位,就要反复扫描文件,效率远不及哈夫曼编码。
此帖是楼主脑子一抽想出来的,所以没有代码,不妥之处,尽请谅解。
好了,此帖结束,而且这编码也有了名字。
2017年04月09日 07点04分 1
level 8
徐一凡_exe 楼主
连质疑的人都没有,看来大家默认了。
[滑稽]
2017年04月09日 10点04分 2
level 8
徐一凡_exe 楼主
2017年04月09日 10点04分 3
蓝了蓝了!
2017年04月09日 10点04分
level 15
233
2017年04月09日 11点04分 4
level 15
楼主你可以专攻算法了
2017年04月09日 11点04分 5
我只是小学生,动归都搞不定[滑稽],专攻什么算法。
2017年04月09日 12点04分
@徐一凡_exe 233动态规划。[滑稽]
2017年04月09日 14点04分
@徐一凡_exe 你以后可以高算法嘛[滑稽]
2017年04月09日 14点04分
2017年04月09日 14点04分
level 8
徐一凡_exe 楼主
庆祝楼主Minecraft入正,到国外正版服找虐的感觉真好。[滑稽]
2017年04月09日 12点04分 6
level 8
徐一凡_exe 楼主
我发现近两年几乎没有一个精品贴,这究竟是人才的埋没,还是吧主的懒惰?
[滑稽]
2017年04月09日 12点04分 7
现在没吧主了。。。
2017年04月09日 15点04分
level 8
徐一凡_exe 楼主
还是懒得申精?
[滑稽]我想多了,这种脑抽贴怎能成为精品贴呢?
2017年04月09日 12点04分 8
level 14
泥可以看下吉利的博客,对于压缩算法。
无损压缩的话可以有哈夫曼编码(用贪心把很多相同的字符压缩,这个东西不能到信息熵的下届)、游程编码(连续的相同字段压缩)、算术编码(Intel的,动态分配概率把文件表示到小数区间里)。但是由于信息熵的约束,其实无损压缩是有理论下届的。
而对于有损压缩(比如音频、图片的),可以用切掉虚数中三角函数一半的快速傅里叶存储主要色块信息(jpeg格式的图片即用此算法后随之用游程编码、哈夫曼编码等压缩,压缩率可以降到1%以下)。
至于其他什么自创的编码、、估计都要挂的。。估计你是可以压缩却不能解压之类的、或者压缩了主体却发现还要记录更多的信息来描述压缩规则之类的。。
2017年04月09日 14点04分 9
[真棒]毕竟算法学发展这么久了,自己想要搞出别的更好的算法还是有点困难的
2017年04月09日 15点04分
确实要记录等多信息才能解码,哈夫曼不是也一样吗
2017年04月09日 22点04分
@徐一凡_exe 所以哈夫曼这种来一个长随机字符串他就基本没办法了,他就可以拿来压缩压缩英文原著。。
2017年04月10日 00点04分
哈夫曼是文件越大越有效吧,再说字符也只有256个(按ascii)重复率是有保证的
2017年04月10日 12点04分
level 11
lz
你知道有句很有名的英语叫 The quick brown fox jumps over the lazy dog. 吗
2017年04月09日 15点04分 10
word彩蛋,有名的绕口令。[滑稽]
2017年04月09日 22点04分
@徐一凡_exe [滑稽]知道就好
2017年04月10日 10点04分
level 8
徐一凡_exe 楼主
pascal吧没救了,水贴、广告贴都沉不下去,反而一个个浮上来[怒]
2017年04月12日 11点04分 11
level 12
并不是优化吧
2017年04月26日 17点04分 12
这个算负[滑稽]优化。
2017年04月26日 23点04分
1