我不确定问这个问题的最佳方式,所以让我从一个例子开始。
假设我有一个完整的可能项目列表(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个项目,那么我会开始使用更多的数据来对它们进行编码。
有没有更好的方法来解决我没有想到的问题?我希望我所说的有道理。如果我能澄清任何事情,请让我知道,并提前感谢您的帮助!
将排列编码为阶乘整数。对于许多项目,您将需要大量的例程。在最坏的情况下,它需要90个字节,其中有128个项目的排列。注意,使用每个项目7个比特来简单地存储序列需要112个字节。
在所示只有八个项目的情况下,则需要两个字节来对排列进行编码。虽然使用位图的16个字节,但总共有18个字节。而不是仅仅用7个字节直接编码值。
总的来说,你不会从你的序列被限制在不重复的值这一事实中看到很多好处。