【发布时间】:2020-04-18 14:23:45
【问题描述】:
我有一些像下面这样的字符串
ff8870fd30db56efd72e8b499a454c4e27be6ab70e23dd59a864563628e998a
我尝试压缩大约 2Kbytes,但我没有得到很好的压缩率
使用 gz 我只减少了 400 字节,使用 defalte 我减少了 450 ..
有没有更好的算法来减少至少 50% 以上的压缩。
【问题讨论】:
标签: compression gzip
我有一些像下面这样的字符串
ff8870fd30db56efd72e8b499a454c4e27be6ab70e23dd59a864563628e998a
我尝试压缩大约 2Kbytes,但我没有得到很好的压缩率
使用 gz 我只减少了 400 字节,使用 defalte 我减少了 450 ..
有没有更好的算法来减少至少 50% 以上的压缩。
【问题讨论】:
标签: compression gzip
根据定义,您不能压缩随机数据,因为它不包含任何您可以使用更少位以更有效的方式表示/描述的结构。 如果可能的话,数据包含一个结构并且不再是随机的。
一个常见的反驳论点是,如果给定足够的赔率,RNG 甚至可以生成一个全 0 的字符串,但魔鬼在细节上:一切都与赔率有关! 即使在很小的 2KB 空间中,如果数据是由真正的 RNG 或带有合理数量的噪声的稳健 PRNG 算法生成的,那么您也有 2^(2048*8) 个可能的字符串,并且这些刺中的绝大多数不会包含任何合理的您可以压缩的“订单”数量。
您在 2 KB 上获得 400 B / 450 B 压缩这一事实强烈暗示您正在查看的字符串并不是真正随机的,只是非人类可读或“随机外观”。
GZ 格式基于 Deflate 压缩算法,因此不清楚为什么将这两个数字分开显示 - Deflate 以牺牲速度为代价接受各种微调压缩的参数,因此不同的设置可以证明不同的结果。
为了更好地压缩看似随机(但不是真正随机!)的数据,可以尝试使用 LZMA2 (7-Zip) 甚至更好的 ZPAQ (http://mattmahoney.net/dc/zpaq.html)。
【讨论】:
我确实知道这比 OP 晚得多....但是,如果您查看数据的表示方式,那么是的,将很难找到重复作为字符串...但是...
举个例子 给定的“ff8870fd30db56efd72e8b499a454c4e27be6ab70e23dd59a864563628e998a”...
还可以如何表示这些信息?这些看起来都是十六进制对联……例如 “0xff 0x88 0x70”等......所以......如果这是以字节为单位存储的......你会自动获得100%的压缩,因为每个字符本身就是一个字节......
如果我们想变得非常聪明,我们可以看看一些数学运算,说我们可以将这些数据映射到更容易压缩的数据。当然这只会对非常大的数据有益,因为少量数据的编码可能会变大...
【讨论】: