【问题标题】:Conditionally replace elements in PHP 2D array有条件地替换 PHP 2D 数组中的元素
【发布时间】:2014-06-10 16:23:39
【问题描述】:

目前,我正在使用以下代码替换数组中大于$value的元素

for($i=0;$i<$row;$i++) {
            for($j=0;$j<$column;$j++) {
                if($solution[$i][$j] >= $value) {
                    $solution[$i][$j] = -1;
                }
            }
        }

有没有更好更快的方法呢?我有一个复杂的算法来生成谜题,我正在尝试优化执行时间。这段代码是算法的一部分。

编辑:

这些是我通过尝试不同的解决方案得到的执行时间:

For loops:

4.1007995605469E-5

Answer by mark:

0.00057792663574219

Foreach loops:

2.9087066650391E-5

【问题讨论】:

  • 需要多长时间,您希望多长时间?
  • 只是想知道,是否可以在不循环的情况下替换数组元素。我不知道确切的执行时间。
  • 这个问题不做基准就无法回答。请执行它们并与使用array_walk()array_map() 和其他功能的解决方案进行比较。
  • 因此,您当前的解决方案将在 O(n^2) 中运行。为了做得更好,我们可能需要了解 $value 的已知时间与 $solution 数组的构建时间。例如,您可以在填充数组时进行替换吗?
  • $solution 是 4x4(最多可以是 9x9)预填充了值(例如:4X4 可能包含从 1 到 16 的值)。在算法的后期,我回溯并需要将 $solution 的值替换为 -1(这是数组中所有元素的初始值)。

标签: php arrays algorithm optimization execution


【解决方案1】:

试试

array_walk_recursive(
    $solution, 
    function(&$aVal, $key, $value) {
        $aVal = ($aVal >= $value) ? -1 : $aVal;
    },
    $value
);

但您需要进行基准测试

【讨论】:

  • 好的,我试试看。
  • 从根本上说,这不会改变执行时间为 O(n^2) 的事实,尽管它可能比 PHP 循环更快,因为您将使用底层 C 循环。
  • 我尝试了解决方案并使用 microtime() 来计算执行时间。这比普通的 PHP for 循环慢。
  • @MikeBrant - 底层 C 循环可能更快;但回调的成本可能会抵消这一点
  • 您还可以测试嵌套的foreach() 循环,其值为by reference
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2014-11-07
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多