【问题标题】:how to encode list of items and specify the order如何编码项目列表并指定顺序
【发布时间】:2015-11-12 22:26:12
【问题描述】:

我不确定问这个问题的最佳方式,所以让我从一个例子开始。

假设我有一个完整的可能项目列表(i1、i2、i3、i4、....i128)。我想要的是指定一个子列表(我们称之为列表 A),它指定列表中的项目,以及列表的顺序是什么。现在假设我想以尽可能小的方式对其进行编码。假设列表 A 如下:

i1, i2, i5, i20, i50, i80, i103, i121

如果我知道我的项目总是按顺序排列,那么我想我可以轻松地创建一个位数组,其中 1 表示项目存在,0 表示不存在。在我的示例中,我有 128 个可能的项目,因此我可以表示 16 个字节中存在的内容。所以列表 A 将是

1100100000000000000100.......
In Bytes: C8 00 10 00 00 00 40 00 .....

但是现在,我怎样才能以不再使用 8 个字节的方式来表达顺序?

我意识到对于这个例子,通过将每个项目分配给一个特定的值,然后将这些值按我想要的任何顺序排列,只按顺序对列表进行编码会更少的数据,但是如果我的列表大于 16 个项目,然后我会开始使用更多数据来对它们进行编码。

有没有更好的方法来解决这个问题,我没有想到?我希望我所说的有道理。如果我能澄清任何事情,请告诉我,并提前感谢您的帮助!

【问题讨论】:

    标签: encoding compression binary-data huffman-code


    【解决方案1】:

    将排列编码为factoradic integer。对于许多项目,您将需要大量例程。在最坏的情况下,它需要 90 个字节,其中您有 128 个项目的排列。请注意,使用每项 7 位来简单地存储序列需要 112 个字节。

    在仅显示八个项目的情况下,需要两个字节来编码排列。尽管位图有 16 个字节,但总共有 18 个字节。而不是直接对值进行编码的七个字节。

    总体而言,您不会从序列仅限于非重复值这一事实中获得很多好处。

    【讨论】:

    • 假设我有一些已知的预定义列表,比如说列表 B 是所有偶数项,列表 C 是所有添加项,列表 D 只是 1-8,等等。假设我有类似于 64 或 128 个预定义列表。有没有办法我可以使用这些来减少这样的数据?我在想我可能已经将部分或全部项目及其顺序存储在不同预定义列表的部分中。是否有更好的方法通过预定义其他内容来减少这些数据?感谢您的快速反馈!
    • 好吧,显然如果你有 128 个预定义列表,那么你可以为它们存储一个 7 位的标识符。
    • 当然,但可以说我想创建一个不在预定义列表中的列表。有没有办法对多个列表的一部分进行编码?例如,假设我将列表 B 作为所有偶数项,将列表 E 作为项目 1-20,并且我想创建一个新列表,即 [2, 4, 6, 8, 9-15, 16, 18, 20]。有没有办法使用列表 B 和 E 来定义我的新列表?显然这是一个简单的例子,所以我真正的问题是我可以使用预定义列表中的信息来定义任何新列表,同时仍然只使用少量数据。谢谢!
    • 除非您对您的数据有更多了解,否则会极大地限制可能的序列(即,每次您消除一半可能的剩余序列时,您会将表示的大小减少一位),或显着扭曲看到某些序列与其他序列的概率,那么就没有逃避以相等概率表示所有可能序列所需的位数。无论您尝试创建多么聪明的方案。 (事实上​​,与简单的计数方案相比,越聪明,您将使用的位数越多。)
    • 明白了。我认为这是有道理的。非常感谢您的所有反馈!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多