我需要找到 Si * Ci 的 SUMMATION (对于i,范围为1到n)。
以下是约束:
1≤n≤10^ 6
1≤si≤10^ 6
1≤ci≤10^ 6
这是我的代码。
<?php
for($i = 0; $i < $n; $i++){
$total += ($s[$i] * $c[$i]);
}
?>
但是,对于高输入值(最多10 ^ 6),代码会耗尽时间。
如何在不超过执行时间的情况下使用适当的优化技术添加如此庞大的数字。
答案 0 :(得分:2)
您可以使用set_time_limit
在此处阅读更多内容:http://php.net/manual/en/function.set-time-limit.php
set_time_limit - 限制最长执行时间
bool set_time_limit(int $ seconds)
如果将其设置为零,它将一直运行,直到脚本完成执行或手动中断。将它放在脚本的顶部以执行此操作:
set_time_limit(0);
更新
使用PHP以外的语言。
答案 1 :(得分:1)
您应该注意几个方面:
这些操作可能需要很长时间,因此您必须更改请求时间限制:
set_time_limit(0);
PHP为这些操作提供了一些map / reduce函数。一个是array_map()
,另一个是array_reduce()
function multiply($s, $c) {
return $s * $c;
}
function sum($carry, $item)
{
$carry += $item;
return $carry;
}
$result = array_reduce(array_map('multiply', $s, $c), 'sum');
你可以使用匿名函数作为回调。
根据您的数据,您应该注意容量/精度问题。在这种情况下,请查看bcmath
扩展程序和bcmul()
bcadd()
函数。