有一个函数总是输入一个间隔(在本例中是自然数),这个函数返回一个结果,但是在处理器上非常昂贵,在本例中是由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更方便。这是问题的可视化表示:
当然,在这个例子中,
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/