【问题标题】:Optimization on huge set of input大量输入的优化
【发布时间】:2016-01-15 08:21:06
【问题描述】:

我需要找到 Si * CiSUMMATION(对于 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),代码会超时。

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

【问题讨论】:

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


【解决方案1】:

您可以使用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 以外的语言。

【讨论】:

  • 没有。我想要一种优化的技术来解决它。我需要知道我是否可以用快速的最优解来解决。
  • PHP 可能不是基于您的代码优化它的最佳选择。 PHP 有 BC 数学函数,但不确定这些函数是否更快:php.net/manual/en/ref.bc.php
  • 我建议尝试一种不同的语言来完成你想要的。
【解决方案2】:

有几个方面你应该注意:

执行时间

这些操作可能需要很长时间,因此您必须更改请求时间限制:

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

【讨论】:

  • 尝试了 map/reduce。不适用于大型集。我想我将不得不寻找另一种编程语言。
  • PHP确实不是此类操作的最佳选择,但如果必须在PHP中进行操作,它具有一些功能
  • 您能否提供一个代码 sn-p 以任何其他可以完成的语言来完成此操作
  • @SankalpTambe 这取决于语言。但是所有语言的问题都是一样的。
猜你喜欢
  • 2012-01-17
  • 2014-12-28
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 2019-12-29
  • 2013-11-19
相关资源
最近更新 更多