【问题标题】:Encoding numbers to a single number将数字编码为单个数字
【发布时间】:2023-03-08 17:22:01
【问题描述】:

我对数字及其表示有疑问。

我有一组最大可能值为 1 000 000 的自然数,称之为 NUM。从集合 NUM 中取 1-50 个数字,其中同一个数字可以包含多次,称之为 IN。使用以下条件将集合 IN 转换为单个数字 (OUT):

  1. OUT 将唯一标识集 IN。

  2. 可以使用两个 OUT 编号(,=)的比较,完全取决于 OUT 的创建时间(一次只创建一个 OUT)

(3.优选)将OUT转换为原始集合IN。


例子:

NUM={1,2,3,4,5,6,7,8,9,10,......,1000000}

IN1={2,4,6}, creation time 1

IN2={1,3,8}, creation time 2

IN3={4,4,4}, creation time 3

---------------------------------------------- H2>

OUT1=function(IN1,time 1)

OUT2=function(IN2,time 2)

OUT3=function(IN3,time 3)

  1. OUT1 != OUT2 != OUT3

  2. OUT1

  3. IN1=reverse_function(OUT1)


有没有办法找到这个function()reverse_function()???

【问题讨论】:

  • 有几种方法。例如,您可以让 nn:th 素数表示,并使用乘法。假设您要存储245,您将使用3*7*11 = 231。要返回245,您只需分解231。 (也适用于数字的重复。)
  • OUT will uniquely identify set IN 将需要 huge 值的 out,这取决于 IN 的基数(以及 time of creation 的可能值的数量)。使用 OUT 唯一,re/inverse 应该不是问题。
  • 究竟什么叫“单数”。没有足够大的原生数据类型来打包 50 个从 1 到 100 万范围内的数字(即 300 位 ~ 997 位)。
  • 如何表示“创作时间”?

标签: algorithm encoding numbers integer transformation


【解决方案1】:

有几种方法。 一种非常常见的方法是将每个不同的数字映射到一个素数,然后编码这个数字在指数中出现的频率。

Gödel numbering

如果每个数字只能出现一次,您甚至可以摆脱从数字到素数的映射。比您可以将数字本身存储在素数的指数中(每个数字都有不同的素数) 例如你想存储 {123,47,2} 你能做到吗 像这样:

result=(2^123)*(3^47)*(5^2)

您可以通过进行素数分解并查看指数来逆转这一点。

【讨论】:

    【解决方案2】:

    你基本上不能做 OUT 唯一标识 IN 的部分,如果 IN 是一组具有 1-50 个成员的数字,其中每个成员可以是从 1 到 1,000,000 的数字并且重复是允许。

    显然,如果集合只包含一个数字,那么可能只有一百万个集合,因此您的函数只需要返回一百万个可能的值。

    如果集合总是包含两个数字,并且它们可能是相同的数字,那么就有 500,000,500,000(5000 亿)种可能的组合,因此您的函数需要返回 5000 亿个可能的值。

    如果集合包含一个或两个值,那么显然有 5000 亿 + 100 万个可能的返回值。

    如果我们添加三个数字的集合,则可能的返回值会移动到千万亿。当我们包含有 20 个数字的集合时,唯一标识每个集合所需的值范围已达到 40 个 googol(后面有 101 个零的 4)。该值需要超过 42 个字节才能存储在内存中(我怀疑您使用的语言允许使用 340 位整数)。

    这不是一个可行的想法。使用竖线字符或类似字符连接数字的文本表示会好得多。虽然仍然有尽可能多的可能值,但您不会分配足够的空间来存储每一个 - 只是您使用的那些。

    "1|2|3" 唯一标识集合 {1,2,3},是可逆的,是可散列的,也是人类可读的。它也占用了 6 个字节的内存,并且需要很短的时间来构建。任何生成唯一 340 位整数来表示所有可能值的算法都将变得复杂、笨拙,并且生成的值您无法使用。

    【讨论】:

    • 字符串表示不是特别紧凑。对于 50 个输入数字的均匀分布,一个数字的平均长度为 5.88 位;添加管道,你总共得到 344 字节,或 2752 位。纯二进制表示需要 997 位。通过连接数字的二进制表示,它只需要 1000 位并且可以直接访问。
    • 嗯,是的,事实上,将一个集合转换为单个值可能并不需要真正完成。某种类型的可变长度结构仅以二进制格式保存数字本身也一样好,并且 is 集合。确实,这是一个需要更多上下文的问题。可能是问什么样的结最结实,而不是说你是用绳子把砖块绑在一起来砌墙的。撇开这些不谈,最好知道集合中通常会有多少个数字,需要随时存储多少个等等。
    猜你喜欢
    • 1970-01-01
    • 2011-02-28
    • 2013-01-04
    • 2010-12-19
    • 1970-01-01
    • 2020-07-05
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多