有一个函数总是输入一个间隔(在本例中是自然数),这个函数返回一个结果,但是在处理器上非常昂贵,在本例中是由sleep模拟的:

function calculate($start, $end) {

    $result = 0;

    for($x=$start;$x<=$end;$x++) {
        $result++;
        usleep(250000);
    }

    return $result;
}

为了提高效率,有一个旧结果数组,其中包含用于该间隔的函数结果所使用的间隔:
$oldResults = [
    ['s'=>1, 'e'=>2, 'r' => 1],
    ['s'=>2, 'e'=>6, 'r' => 4],
    ['s'=>4, 'e'=>7, 'r' => 3]
];

如果我调用calculate(1,10)函数,它应该能够基于旧结果计算新的间隔并累积它们,在这种特殊情况下,它应该将旧结果从1到2与旧结果从2到6相加,然后再执行新的calculate(6,10)并将其相加。考虑到该函数忽略了从4到7的旧保存间隔,因为使用2-6更方便。
这是问题的可视化表示:
php - 当知道一些子间隔结果时如何有效地进行迭代-LMLPHP
当然,在这个例子中,calculate()非常简单,您可以找到解决这个问题的特定方法,但是在实际代码中,calculate()非常复杂,我只知道calculate(n0,n3)==calculate(n0,n1)+calculate(n1,n2)+calculate(n2,n3)
如果不使用一堆if和foreach,我无法找到解决旧数据重用的方法,我相信有一种更优雅的方法可以解决这个问题。
你可以玩code here
注意:我使用的是php,但我可以阅读js、pyton、c和类似的语言。

最佳答案

如果您确定calculate(n0,n3)==calculate(n0,n1)+calculate(n1,n2)+calculate(n2,n3),那么在我看来,一种方法可能只是建立数据库缓存。
可以预先计算每个离散间隔,并将其结果存储在记录中。

$start = 0;
$end = 1000;

for($i=1;$i<=$end;$i++) {
   $result = calculate($start, $i);
   $sql = "INSERT INTO calculated_cache (start, end, result) VALUES ($start,$i,$result)";
   // execute statement via whatever dbms api
   $start++;
}

现在,只要有新的请求出现,数据库查找就应该快得多。注意,在这个粗略的例子中,您可能需要修改我的边界情况。
function fetch_calculated_cache($start, $end) {

    $sql = "
      SELECT SUM(result)
      FROM calculated_cache
      WHERE (start BETWEEN $start AND $end)
        AND (end BETWEEN $start AND $end)
    ";

    $result = // whatever dbms api you chose

    return $result;
}

有两个明显的考虑因素,例如:
缓存失效。您的calculate功能的结果多久会改变一次?然后需要重新填充数据库。
您要存储多少间隔?在我的例子中,我任意选择了1000个
您是否需要检索非连续间隔结果?你需要把上面的程序分块应用。

关于php - 当知道一些子间隔结果时如何有效地进行迭代,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37007123/

10-10 06:38