对大量输入的优化

时间:2016-01-15 08:21:06

标签: php optimization 32-bit multiplication execution-time

我需要找到 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),代码会耗尽时间。

如何在不超过执行时间的情况下使用适当的优化技术添加如此庞大的数字。

2 个答案:

答案 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);

用于map / reduce的内置函数

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()函数。

相关问题