划分和征服算法的更好的替代方案

时间:2013-03-27 14:44:30

标签: divide-and-conquer

首先让我解释一下我试图解决的问题。我正在将我的代码与第三方库集成,后者执行非常复杂的财务预测。出于这个问题的目的,让我们说我有一个黑盒子,当我传入x时返回y。 现在,我需要做的是找到给定输出(y)的输入(x)。由于我知道最低和最高可能的输入值,我编写了以下算法:

  1. 定义起始输入范围(最小输入值到最大输入值)
  2. 将范围分成两个相等的部分,并找到中间值的输出
  3. 找到哪一半输出
  4. 重复步骤2和3,直到范围太小而无法进一步划分
  5. 这个算法做得很好,我没有看到任何问题。但是,有没有更快的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

听起来像xy强相关(即x增加,y}也是如此,否则您的分而治之算法将无效。

假设这个的情况,你可以计算一个相关因子,然后你可以将中点乘以相关因子,以便更快地磨练期望值。

请注意,我根本没有测试过这个想法,但需要考虑一下。可能的改进是使correlationFactor成为移动平均值,或者根据xLow和xHigh之间的十分位数对其进行预计算。

此外,这假设调用f(x)相对便宜。如果它很昂贵,那么增加对f(x)的呼叫数会使任何节省都相形见绌。事实上 - 我开始认为这是一个愚蠢的想法......

希望以下伪代码说明我的意思:

DivideAndConquer(xLow, xHigh, correlationFactor, expectedValue)
    xMid = (xHigh - xLow) * correlationFactor
    // Add some range checks to make sure that xMid is within xLow and xHigh!!
    y = f(xMid)
    if (y == expectedValue)
        return expectedValue
    elseif (y < expectedValue) 
        correlationFactor = (xMid - xLow) / (f(xMid) - f(xLow))
        return DivideAndConquer(xLow, xMid, correlationFactor, expectedValue)
    else
        correlationFactor = (xHigh - xMid) / (f(xHigh) - f(xMid))
        return DivideAndConquer(xMid, xHigh, correlationFactor, expectedValue)