如何使用已知的常数位和,以及恒定的数字位数来编码大量整数。
基数为10的整数示例,数字和5和3位数:
014, 041, 104, 113, 122, 131, 140, 203 ....
最重要的因素是空间,但计算时间并不完全不重要。
答案 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), 可能更加聪明,但它可能不值得努力。