【问题标题】:find a unique output based on two inputs? [duplicate]找到基于两个输入的唯一输出? [复制]
【发布时间】:2012-06-03 10:35:14
【问题描述】:

我需要找到一种方法,这样用户必须输入 2 个数字(int),并且对于每个不同的值,返回一个输出(最好是 int!)。 假设用户输入 6, 8 它返回 k 当用户输入任何其他内容时,例如 6,79,8 或任何其他输入 m, n 除了 6, 8 (即使只有一个输入被更改)完全不同的输出是产生。但问题是,它应该是唯一的 m, n 所以我不能使用像 m*n 这样的东西,因为 6 X 4 = 24 而且,12 X 2 = 24 所以输出不是唯一的,所以我需要找到一种方法每一个不同的输入,都有一个完全不同的输出,不会重复任何其他值。

编辑:回应 Nicolas:输入范围可以是任何东西,但会小于 1000(但当然大于 1!)

编辑 2:针对 Rawling,我可以使用 long (Int64) 但最好不要使用 float 或 doulbe,因为此输出将用于 for 循环,而 float 和 double 很糟糕for for 循环,可以查看here

【问题讨论】:

  • 如果每个输入小于1000,就存储m*1000 + n。

标签: c# algorithm math unique


【解决方案1】:

由于您的两个数字小于 1000,您可以通过k = (1000 * x1) + x2 获得唯一答案。最大值为999999,正好在32位int的范围内。

【讨论】:

    【解决方案2】:

    你总是可以返回一个long:从两个整数ab,返回2^|INT_SIZE|*a + b

    pigeonhole principle 很容易看出,给定两个 int,一个不能为每个不同的输入返回唯一的 int。解释:如果你有 2 个数字,每个数字都包含 n 位,那么每个数字都有 2^n 的可能性,因此有 (2^n)^2 可能的对,所以从 piegeonhole 原则 - 你至少需要 lg_2((2^n)^2) = 2n 位来代表他们,

    编辑:您的编辑提到您的数字范围是[1,1000] - 因此可以应用相同的想法:1000*a + b 将为每对生成一个唯一的 int。
    请注意,出于同样的原因,结果整数的范围必须是[1,1000000] - 否则会发生冲突。

    【讨论】:

      【解决方案3】:

      因为我没有50个帖子评论,我必须说,有功能 叫Pairing Functions

      Cantor's Pairing Function(显示在上一个链接上)和Szudzik's Pairing Function 等配对函数允许输入是无限的,并且仍然能够提供唯一且确定性的输出。

      这是关于 stackoverflow 的另一个类似问题。 (太好了,我需要 10 声望才能发布两个以上的链接..)

      (http://)stackoverflow.com/questions/919612/mapping-two-integers-to-one-in-a-unique-and-deterministic-way

      编辑:我迟到了。

      【讨论】:

      • 首先感谢您指出重复的目标;我投票结束这个问题,因为它是重复的。要提高此答案的质量,您需要将链接文章的相关位包含到问题中,例如 Cantor 的配对函数本身。然后,作为一个最小的答案,它基本上不会被标记。但是,请尝试回答不重复清晰且可回答的问题。另外,请阅读tour 页面。
      【解决方案4】:

      如果您没有硬性上限,您可以执行以下操作:

      int Unique (int x, int y)
      {
          int n = x + y;
          int t = (n%2==0) ? ((n/2) * (n+1)) : (n * ((n+1)/2));
          return t + x;
      }
      

      从数学上讲,这将为每对没有上限的(非负)整数返回一个唯一的非负整数。

      从编程上讲,它会遇到溢出问题,这可以通过使用long 而不是int 来解决输入变量以外的所有问题。

      【讨论】:

        【解决方案5】:

        典型的数学解决方案是使用素幂。由于每个数字都可以唯一地分解为其主要因素,因此返回 2^n * 3^m 将为每个 n 和 m 提供不同的结果。

        这个可以扩展为2^n * 3^m * 5^a * 7^b *11^c等等;您只需要检查您是否没有用完 32 位整数。如果存在溢出的风险,您可以在除以大于输入范围的素数后取余数,您仍然具有唯一性。

        【讨论】:

        • 我会说康托尔的配对函数更接近于这个问题的规范解决方案(因为它是将所有整数对的集合映射到集合的相关问题的规范解决方案整数),并且需要更少的计算。
        • 公平点;取决于我猜你是来自数论还是集合论:)
        猜你喜欢
        • 1970-01-01
        • 2023-01-12
        • 2021-09-15
        • 2022-12-22
        • 1970-01-01
        • 2021-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多