2012-01-14 65 views
0

如何可以在大整数集合所有具有已知恒定数字和,和数字的恒定量的待编码的整数的有效的编码。具有恒定数字和

在基座10的整数,与数字和5,和3位的实施例:

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

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

+1

对于任何非零数字总和(203,2003,20003,...),此集合是无限的。你对数字的数量有限制吗? – TonyK 2012-01-14 11:42:58

+0

是的,数字的数量也是恒定的。 – Allan 2012-01-14 13:37:56

+0

你想用哪种语言?我在下面的python中提供了一个解决方案。它所缺少的是使用置换库,这非常简单。 – JustinDanielson 2012-01-15 05:50:48

回答

0

最简单的方法是将存储数字和本身,并留在这一点。

但是我可能误解了这个问题。

编辑:这是我的外卖:你想编码集本身;是吗?

编码集合本身是为存储所述基部,所述数字和,和位数一样简单,例如你给的例子中的{10, 5, 3}

大部分的时间,但是,你会发现,一些最紧凑的表示是数字本身,除非是非常大的。

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

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

+0

好的,我需要的是一个编码器和一个解码器(一个编解码器)。关键是数字总和总是相同的。如果我将122编码为数字总和,那么我将得到5,但他们无法将5解码回122。 – Allan 2012-01-14 13:39:24

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)可能更聪明,但它可能不值得。