我有兴趣用最少的字节数来表示有限集中的符号序列。
例如,假设您有一个仅包含字符a-z的文本字符串。您可以将它们编码为ascii,因此每个符号(字符)为1个字节。但是,通过这样做,您每个字节只使用26个可能的256个值。
我编写了一个似乎运作良好的解决方案,但我想知道是否有人知道或者能想出更好的方法。
我的方法是将序列视为基数为n的整数,其中n为the size of the set of symbols + 1
。例如,如果您的一组或多个符号或“字母”为{a, b, c}
(长度为3),那么我们将使用基数4.符号将被赋予数值{a => 1, b => 2, c => 3}
。因此,序列[b, a, c]
被视为基数4中的数字213,因此十进制为39。此整数可以二进制编码,并解码回其基数4表示,以检索序列2, 1, 3 => [b, a, c]
。
我上面的Python实现:radixcodec.py
所以我的问题是,是否有一种更有效的方法来编码有限集中的元素列表而不是我所描述的那个?
答案 0 :(得分:4)
使用base n ,其中 n 是符号的数量(例如{a => 0, b => 1, c => 2}
)。如果每个符号同样可能出现,那么该方法是最佳的。 (当然,您还必须存储字符串的长度。顺便说一句,您的实现使用Python字符串;这些绝对不是您可以找到的最节省空间的数据结构。)
如果符号的频率不同,并且您知道它们,则可以使用Huffman coding。如果你不知道频率,那就是adaptive Huffman coding。
无论如何,最好的方法取决于应用程序。