【问题标题】:Compression of numeric strings数字字符串的压缩
【发布时间】:2010-02-15 16:11:41
【问题描述】:

谁能建议压缩算法对 20-30 位数字字符串进行操作?

【问题讨论】:

    标签: algorithm compression


    【解决方案1】:

    只需使用每个数字的二进制表示,您就可以轻松地将 30 个 字符 字符串压缩到 15 个字节。例如,1592 可以表示为一系列四位值,如下所示:

    0001 0101 1001 0010
    

    当分组为两个四位值的组时,可以在标准 ASCII 中表示为§Т

    此外,如果您的字符串包含许多相同的连续数字,您可以实现Run-Length Encoding 的变体。

    【讨论】:

    • 当心你是否使用了 C 字符串。数字 0 可能是个问题,因为 C 字符串是以 null 结尾的。
    • 这不如将整个字符串表示为一个大整数那么有效。 4 位可以表示 16 个不同的值,因此这种表示浪费了 6/16 = 37.5% 的分配空间。
    • +1。二进制编码十进制 (BCD) 虽然不是最佳的,但它是一个很好的第一个解决方案。它将存储成本降低了 50%,并且增加了非常少的运行时开销。
    【解决方案2】:

    假设你可以有浮点数,你就有可能有 11 个符号:

    [0,1,2,3,4,5,6,7,8,9, .]

    这意味着每个符号需要 4 位。 3 位最多只能表示 8 个符号。您可以轻松地为每个符号使用 4 位并获得大量压缩。

    如果您的字符串中只有整数位,一个简单的解决方案是转换为十六进制,您仍然可以使用每个符号 4 位,同时获得更好的压缩率。 (因为没有 16 个符号的浪费位)

    如果您使用 Huffman 压缩,您将获得最佳比特/每符号比率。你可以read more about Huffman compression here

    【讨论】:

    • 选择采用这种方法。谢谢布赖恩!
    • 在这种情况下,霍夫曼压缩是愚蠢的,因为几乎不可能得出一组相对于数字具有非接近最大熵的数字。
    • 这是一个比使用 delta 编码更好的建议,没有证据表明 delta 编码可以帮助他处理 OP 提供的信息。
    • @BrianR.Bondy 链接无法重定向到www....brianbondy.com/compression/huffman
    【解决方案3】:

    将其设为 2 个 15 位数字并将它们转换为 2 个 64 位整数?或者它们是浮动的?

    【讨论】:

    • 不,它们不是花车。你能再解释一下答案吗?谢谢。
    【解决方案4】:

    把它分解成几个无符号整数?

    “9347692367596047327509604839”

    变成:

    9 347692367 596047327 509604839

    【讨论】:

    • 存在的风险是,如果字符串的最左边的子序列是一个或多个零,那么它们会在您的表示中丢失。
    【解决方案5】:

    一个明显的解决方案是将它们“压缩”为二进制数字表示而不是字符串表示。有关示例库,请参阅 this stack overflow 问题。

    【讨论】:

      【解决方案6】:

      我肯定会选择最简单的解决方案,并将它们存储为整数(大小合适,可以是 32 位、64 位或 128 位,具体取决于需要)。使用支持字符的算法对其进行压缩会浪费大量空间,因为它必须为每个字符提供超过 10 个不同的值 (0-9)。

      【讨论】:

      • 一个好主意,但 20 位数字不适合 64 位整数。虽然编写扩展整数解析等不是火箭科学,但它远非微不足道。此外,这种转换会消除数字字符串中的任何前导零。
      • 当然,必须特别考虑前导零,但尚不清楚字符串是否可以包含并且应该保留前导零。但是请注意,我建议使用“合适的大小”,这意味着“足以容纳您的数据”:)。争论仍然存在。只需使用存储值所需的尽可能多的 n 位单元。 1) 存储任何前导零(如果您希望保留它们) 2) 读取可以存储在一个单元/字中的尽可能多的字符(32 位、64 位等),并将它们存储在一个单元中 3) 重复2) 直到流结束。 4)将单位/单词包装成可读的东西
      【解决方案7】:

      压缩数字的最常见方法之一(假设您有多个要压缩的数字——它很难压缩一件事)是使用delta encoding。它的工作原理是,如果你知道第一个数字是x,并且它后面的数字比较相似,你可以将后面的数字编码为(x+c1)、(x+c2)等。

      在这个方案中,您只需对完整的 x 值进行一次编码,如果您的 c 值小于您的 x,那么您可以节省大量空间。您也可以使用先对数字进行排序的版本,然后您的增量指的是最后一次看到的数字而不是一个数字。使用这种方法,您可以更有效地覆盖更广泛的数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 2011-08-18
        • 2015-12-14
        • 2019-10-04
        相关资源
        最近更新 更多