![]() |
1
63
压缩算法试图找到重复的子序列,以较短的表示形式替换它们。
让我们用25字节长的字符串
幼稚方法
一种幼稚的方法是用相同长度的代码字对每个字符进行编码。我们有7个不同的字符,因此需要长度为
现在我们可以对字符串进行如下编码:
这只需要编码字的25_3位=75位加上字典的7_8位=56位,因此 131位 (65.5%) 或者对于序列:
编码字:
现在我们只需要6_2位=12位作为编码字,10_8位=80位加3_8位=24位作为每个字的长度,因此 116位 (58%)。 哈夫曼码方法这个 Huffman code 用于编码频率更高的字符/子字符串,代码比频率更低的字符/子字符串短:
可能的哈夫曼密码是:
或者对于序列:
现在我们
或者对于序列:
现在,第一个代码只需要78位或8位,而不是像我们的初始字符串那样需要25_8=200位。但是我们仍然需要添加存储字符/序列的字典。对于每个字符的示例,我们需要7个额外的字节(7_8位=56位),每个序列的示例将需要7个字节加上每个序列的长度3个字节(因此59位)。这将导致:
实际数字可能不正确。请随意编辑/更正。 |
![]() |
2
10
检查 this 维基页面…
|
![]() |
3
5
无损压缩算法将每个可能的输入转换为不同的输出,这样更常见的输入转换为更短的输出。这在数学上是不可能的 全部的 可能需要压缩的输入——否则,您将有多个输入a和b压缩到同一个表单,所以当您解压缩它时,是返回到a还是返回到b?在实践中,最有用的信息有一些冗余,并且这种冗余符合某些模式;因此,数据可以有效地被压缩,因为 扩大 当你压缩它们时,自然不会出现。 例如,在jpeg或mp3压缩中使用的有损压缩,其工作原理是通过一些信号来近似输入数据,这些信号可以用比原始数据更少的位来表示。当你减压时,你得不到原始的,但你通常能得到足够接近的东西。 |
![]() |
4
3
简单来说,常见的压缩形式是 http://en.wikipedia.org/wiki/Dictionary_coder . 这包括用较短的字符串替换较长的重复字符串。 例如,如果您有一个如下所示的文件:
它大约有150个字符,但是如果您在哪里做一个简单的替换,如下所示: a=“星期一晚上”,b=“星期二晚上”,c=“棒球”,d=“垒球”,e=“7:00 pm”,f=“8:00 pm”,g=5:00 pm” 然后相同的内容可以编码为:
使用25个字符!如果我们对文件的格式做了更多的假设,一个聪明的观察者也可以看到如何将其进一步简化为15个字符。显然,替换键的开销很大,但通常非常大的文件都有很多这样的替换。这是一种非常有效的压缩大型文件或数据结构的方法,并且仍然允许它们“稍微”具有人类可读性。 |
![]() |
5
0
罗塞塔密码有一个 entry 关于哈夫曼编码,和前面的一样 blog entry 我的。 |
![]() |
Adam Fraser · 以字符串形式高效地读取java中的任何文件 6 年前 |
![]() |
MathBunny · 适用于小字符串列表的良好字符串压缩算法/方法? 6 年前 |
![]() |
Barny · 特定长阵列的压缩可能性 6 年前 |
![]() |
aja · 验证是否使用lzo1z压缩对数据进行压缩 6 年前 |
![]() |
Philippe Ear · 哈夫曼压缩[关闭] 6 年前 |