【问题标题】:How to determine if x and y exist in a set of integers X that satisfies an equation如何确定 x 和 y 是否存在于一组满足方程的整数 X 中
【发布时间】:2012-04-25 02:29:24
【问题描述】:

我刚刚在准备考试时遇到了一个考试问题,我被困住了。 问题是:

设计一个算法,给定一组正整数 X,确定方程 x5 + xy - y2 = y3 有一个 x 和 y 都属于 X 的解。

不涉及编程,仅涉及算法设计。有人可以分享他们的想法吗?

暴力是不可接受的

【问题讨论】:

  • 很大程度上取决于 X 是否是有限的,以及它以什么形式给出。

标签: algorithm


【解决方案1】:

伪代码:

result = false
foreach (x in X) {
    foreach (y in X) {
        if (x^5 + x*y - y^2 == y^3) result = true
    }
}

是否比预期的更复杂?如果是这样,可以像这样利用高阶项x^5

Sort X as a list from least to greatest.
result = false
foreach (y in X) {
    v = y*y*(y+1)
    foreach (x in X) {
        x2 = x*x
        u = x2*x2 + x*y - v
        if (u == 0) {
            result = true
            goto [DONE]
        }
        if (u > 0) goto [NEXT]
    }
    [NEXT]
}
[DONE]

【讨论】:

  • 这基本上是暴力破解。抱歉,我刚刚编辑了问题,包括讲师不接受暴力破解。
  • 很公平。作为回应,我已经编辑了答案,不要强行使用它。
  • 我更了解这一点。但我认为我看到了一个错误;当您分配 u = x2*x2*(x+y) - v 时,最终方程由 (x^4)y 而不是 xy 组成。或者这是你打算做的?
  • 对。现在纠正错误。谢谢。
【解决方案2】:

对于(真的!)大量输入,您可以:

  1. 对列表进行排序;
  2. 使用formula 求解每个数字的三次方程。这里假设每个数字都是x,所以方程变成了y的三次方程,那么公式是适用的。然而,这个公式可能需要很长时间,为了避免可能的精度问题,您可以插入答案来检查它。然后对排序列表进行二分查找 (O(logn))。

这将渐近 O(nlogn),但常数因素是可怕的,并且被大哦很好地隐藏了(好吧,如果你正在回答问题,而不是编写程序)。当然,如果允许散列(这通常是面试的情况,但不一定是考试),这可能是 O(n)。

【讨论】:

    【解决方案3】:

    求解 y 作为 x 的函数:http://www.wolframalpha.com/input/?i=x%5E5%2B+xy+-+y%5E2+-+y%5E3

    y(x) := INSERT_EQUATION_HERE
    any((y in setX) for y in y(x) for x in setX)
    

    这需要 O(|X|),即线性时间。

    或者,如果您没有使用具有any 函数或列表操作的语言,那么您的解决方案必须更加冗长:

    for x in setX:
        possibleYs = solveForY(x)
        for y in possibleYs:
            if y in setX:
                return SOLUTION:(x,y)
    return NO_SOLUTION
    

    您实际上不必像我上面展示的那样求解 2D 多项式。相反,您可以考虑集合中的每个 x;这修复了 x 并为您提供了 y 中的多项式。然后,您在恒定时间内求解该多项式。例如,如果 x=0,我们会找到 y^2==y^3 的 3 个解;如果 x=1,我们会找到 2-y^2==y^3 的 3 个解决方案,如果 x=-0.52,我们会等等。解决方案是 http://en.wikipedia.org/wiki/Cubic_function#General_formula_of_roots

    问题的更一般版本:

    如果您考虑任意多项式,请注意此方法只能在以下情况下提供 O(1) 效率:min(max_x_degree, max_y_degree)Galois theory 中所证明的那样,具有某些封闭形式解的唯一多项式是 4 次或更小的多项式。而在这个问题中,我们可以把度数最高的变量变成一个常数。

    这并不是说在 min(max_x_degree, max_y_degree)

    如果增加变量的数量,事情也会变得更有趣。

    【讨论】:

    • @ZiyaoWei:对于给定的 x 值,y 只能取 3 个值。对于集合中的每个值,检查这些值是否也在集合中。 (使用哈希表/哈希映射/字典设置成员资格为 O(1))
    • 哦哈希表!这取决于讲师,因为理论上你总是可以完美地散列一组给定的整数,即使这需要整个宇宙的状态来描述。但有时教授会反对它,因为它不是很稳定。无论如何,很好的答案!
    • 你确定吗?解释将被感兴趣地阅读!你的回答在我看来是错误的,但我愿意学习新的东西。
    • 我现在看到你对@ZiyaoWei 的回答了。
    • 我愿意承认我看不到如何快速填充哈希表。
    【解决方案4】:

    如果集合 X 不是很大,那么简单的蛮力算法可以通过构造 2D 矩阵来工作。

    【讨论】:

    • 不幸的是,讲师不喜欢暴力接近。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2016-12-05
    • 2014-03-21
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多