具有恒定数字和的整数的高效编码

时间:2012-01-14 11:16:22

标签: encoding

如何使用已知的常数位和,以及恒定的数字位数来编码大量整数。

基数为10的整数示例,数字和5和3位数:

014, 041, 104, 113, 122, 131, 140, 203 ....

最重要的因素是空间,但计算时间并不完全不重要。

2 个答案:

答案 0 :(得分:0)

最简单的方法是存储数字和本身,然后保留它。

但我可能会误解这个问题。

编辑:这是我的要点:您想要对集合本身进行编码;是吗?

对集合本身进行编码就像存储基数,数字和和数字一样简单,例如你给出的例子中{10, 5, 3}

然而,大多数时候,你会发现数字的最紧凑表示是数字本身,除非它非常大。

另外,因为数字和通常被认为是递归的;在一到九之间,包括在内; 203具有与500,或140或950相同的数字和。这意味着该集合对于任何数字组合都是巨大的,并且任何集合(除了某些退化情况)使用它们中的每个可用数字它们与...有关。

因此,您知道,单独存储时数字本身的最有效编码就变成了数字本身,特别是考虑到±2 147 483 648之间的每个数字通常在内存中占用相同的空间,并且通常在存储中。

答案 1 :(得分:0)

如果您有明确定义的一组可能值进行编码,则直接编码理论方法是按顺序编号所有可能的值,然后根据需要存储此数字。如果各个值的频率相同或未知,则这非常明显。如果您对频率分布有所了解,则必须使用类似霍夫曼代码的方法来获得真正的最佳结果,但这相当复杂,我只处理其他情况。

对于均匀分布(或未知)的情况,方法如下: 想象一下(您可以预先生成并存储它,或者在运行中生成它)按字典顺序排列的所有输入(用于编码)值的列表。例如。在您的情况下,列表将开始(除非您的数字和是递归的):005,023,032,050,104,113,122,131,140,​​203,212,221,230,401,410,500。 然后根据列表中的位置为列表中的每个项目分配一个整数:005变为0,023变为1,032变为2,依此类推。有(除非我犯了一个错误,如果是这样,适当调整)列表中的16个值,你需要4位来编码列表中的任何索引。该索引是您的编码值,编码和解码变得明显。

至于首先生成列表的算法:最简单的方法是从000到999计算并抛弃与你的标准不符的所有内容。通过复制计数和溢出(例如104如何跟随050), 可能更加聪明,但它可能不值得努力。