【问题标题】:Best compression algo for random string随机字符串的最佳压缩算法
【发布时间】:2020-04-18 14:23:45
【问题描述】:

我有一些像下面这样的字符串

ff8870fd30db56efd72e8b499a454c4e27be6ab70e23dd59a864563628e998a

我尝试压缩大约 2Kbytes,但我没有得到很好的压缩率

使用 gz 我只减少了 400 字节,使用 defalte 我减少了 450 ..

有没有更好的算法来减少至少 50% 以上的压缩。

【问题讨论】:

    标签: compression gzip


    【解决方案1】:

    根据定义,您不能压缩随机数据,因为它不包含任何您可以使用更少位以更有效的方式表示/描述的结构。 如果可能的话,数据包含一个结构并且不再是随机的。

    一个常见的反驳论点是,如果给定足够的赔率,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)。

    【讨论】:

      【解决方案2】:

      我确实知道这比 OP 晚得多....但是,如果您查看数据的表示方式,那么是的,将很难找到重复作为字符串...但是...

      举个例子 给定的“ff8870fd30db56efd72e8b499a454c4e27be6ab70e23dd59a864563628e998a”...

      还可以如何表示这些信息?这些看起来都是十六进制对联……例如 “0xff 0x88 0x70”等......所以......如果这是以字节为单位存储的......你会自动获得100%的压缩,因为每个字符本身就是一个字节......

      如果我们想变得非常聪明,我们可以看看一些数学运算,说我们可以将这些数据映射到更容易压缩的数据。当然这只会对非常大的数据有益,因为少量数据的编码可能会变大...

      【讨论】:

        猜你喜欢
        • 2020-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        相关资源
        最近更新 更多