【问题标题】:Binary run length encoding二进制游程编码
【发布时间】:2011-09-29 14:18:51
【问题描述】:

我有一个 Web 表单,我想在 Base64 中为其内容生成一个简短的表示。除其他外,该表单包含 264 个二进制值的列表,其中大部分将在任何时候为 0。 (它们代表地理地图上的区域)。即使在 Base64 中,这个 264 位数字也会生成一个长而令人生畏的字符串。我想尽可能高效地实现游程编码。你能帮我解决这个问题吗?我搜索了二进制 RLE,但没有发现任何用处。

到目前为止我已经尝试过什么 - 使用十进制计数和“A”作为分隔符在二进制字符串上运行 RLE,表示 0 和 1 之间的变化,然后将结果从基数 11 转换为以 64 为基数。例如:

00000000001111111000000010000000000000000000000001111111110001111010101000000000000000000000000000000000000111111111110111000000000000111111100000001000000000000000000000000111111111000111101010100000000000000000000000000000000000011111111111011100

变成

10A5A5AA22A7A1A2AAAAAAA34A9AA1A10A5A5AA22A7A1A2AAAAAAA34A9AA1A

又变成了

CNnbr/FxkgbbOw0LNAKgk65P8SdvaTG+t74o

或者,以 62 为基数,

6imo7zq1pqr2mqglTHzXwJRAksm7fvHZHWQK

这更好,但我仍然不禁怀疑我是否做错了什么 - 使用数字“A”作为分隔符是最好的方法吗?

还有另一个更新:

感谢@comingstorm,我将压缩字符串缩短了一些。

ILHHASCAASBYwwccDASYgAEgWDI=

正如我在 cmets 中提到的,实际用例通常会导致字符串更短。

【问题讨论】:

    标签: math binary compression run-length-encoding


    【解决方案1】:

    由于您正在对位进行编码,因此您可能希望使用基于位的 RLE 而不是基于字节的 RLE。在这种情况下,您应该考虑使用Elias gamma coding(或其一些变体)来有效地编码您的运行长度。

    您的编码格式的一个合理的初步近似值可能是:

    • 第一位 = 与未压缩字符串的第一位相同(用于设置初始极性)
    • 剩余位:连续位运行的 Elias 编码长度(交替 1 和 0)

    由于您知道未压缩字符串中有多少位,因此您不需要终止代码;您可以将任何必要的二进制填充添加为任意位。

    请注意,游程“压缩”始终可以扩展您的位串;如果您对此感到担忧,可以添加另一个初始位来指示您的数据是压缩格式还是未压缩格式,从而将压缩开销限制为 1 位。

    【讨论】:

      【解决方案2】:

      264 位,只有 33 字节,base64 中只有 44 字节。我认为这个(非常少的)信息量很难压缩。稀疏表示 nulvinge 也仅存储非零元素及其值(因为您只有 0/1),即在您的情况下仅存储非零位的索引。但是由于您有 264 位可能的位 - 您需要 9 位作为索引,这意味着,如果您有超过 29 个非零条目,则您需要的不仅仅是原始的。

      也许您的问题表述错误,但我看不出 264 位如何导致令人生畏的 base64 字符串(您如何生成它 - 也许您翻译的不是 264 位,而是 264 个 ASCII 字符(值为 01) - 这可以解释你的长结果字符串吗?)。

      【讨论】:

      • @egasimus:你说得对,我是用字长计算的。但一般的说法甚至适用于 44 字节:太小而无法很好地压缩。
      • 好吧,我已经设法刮掉了几个字母,见上文。上面的二进制数实际上是一段不太可能的输入数据。在更现实的情况下,它会变得更短。我不确定是否使用“A”。
      【解决方案3】:

      我认为您想要的另一种选择是稀疏矩阵: http://en.wikipedia.org/wiki/Sparse_matrix

      【讨论】:

        猜你喜欢
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 2022-01-11
        • 2014-10-09
        • 2014-08-09
        • 1970-01-01
        • 2013-06-03
        相关资源
        最近更新 更多