如何将一系列数字转换为单个数字?

Deb*_*iti 6 algorithm math numbers

我想将一系列数字转换为单个数字,这将保留单个值以及它们的位置.例如,提供以下顺序─

1,6,7,8,9,45,67

这里,例如,如果我应用简单的加法,即1 + 6 + 7 + 8 + 9 + 45 + 67,那么将生成一个数字.但是从那个没有.我们不能用它们的顺序提取单个数字[即1,6,7,8,9,...].

有没有办法实现这个功能,没有任何模糊的推论[即只从一个数字中提取一组唯一的数字.]?是否有任何数学函数可以帮助从这个数字中找回各个元素?

Eri*_* J. 9

您可以将其转换为基数为N的数字,其中N比输入序列中出现的最大值大1.

UPDATE

基于各种评论,我想提供一种可能更容易实施的替代解决方案.您可以将序列视为UTF-8编码的字符串,并将Huffman编码与自定义字典一起使用以实现紧凑的表示.

自定义词典允许您存储极少数位的非常常见的字符(例如,序列分隔符','和单个字符'0'..'9'可以存储少至3位,但也可以存储其他数字您发现在统计上可能发生的事件可以存储在短位序列中.例如,如果您发现频繁出现"42",则可以仅在几位中存储"42".

如果只将特殊代码分配给','和'0'到'9',则输入字符串中每个字符的平均值小于4位,同时保留逗号分隔序列成员.查找常见的多字符子串并将它们添加到字典中只会提高该比率.

使用自定义词典也意味着你具备存储字典中的压缩数据的头,因为它是众所周知的给你.

我使用SharpZipLib做了类似的事情

http://www.icsharpcode.net/opensource/sharpziplib/

http://community.sharpdevelop.net/forums/p/8255/23219.aspx

使用zlib也很容易

压缩小块数据


Ste*_*sop 5

从数学上来说,对于有限序列来说是可能的,但不太实用,因为所需的数字很快就会变得非常大:有 67 7(大约 2 42)个不同长度 7 的整数序列,从 1 ... 67 ,更不用说更长了序列和更大的整数。

对于此类函数的简单示例,将序列 [1,6,7,8,9,45,67] 映射到值 2 1 * 3 6 * 5 7 * 7 8 * 11 9 * 13 45 * 17 67。底数是质数,幂是序列中的元素。

反向映射是通过除法计算的——您的值除以序列中的第一个元素的次数2,等等。该值的最大质因数告诉您序列的长度。

如果要允许0序列中包含正数,则在对素数求幂时将所有元素加 1。或者使用 的幂2来给出序列的长度,然后开始对以 开头的元素进行编码3

哥德尔在证明他的不完备定理时使用了这样的编码。

正如 Kendall Frey 所说,不可能定义一个将每个无限整数序列映射到不同整数的函数。这是康托证明自然数的幂集不可数的结果:您甚至无法将所有无限的元素序列单射映射到{true, false}整数,更不用说将所有无限的元素序列映射到整数。

对于更实用的方法,请考虑将整数序列编码为字节序列,而不是数字。有限的字节序列可以很容易地被认为是二进制值,因此它是一个数字,您只是没有真正使用它。示例序列的常见表示形式是字节序列:[1,6,7,8,9,45,67],例如在 JSON 中使用。这是一个 136 位的数字。反转此映射的数学函数涉及 256 的算术模幂、减去数字 48、乘以 10 等:-)