代码之家  ›  专栏  ›  技术社区  ›  Todd Moses

多个数组还是一个多维数组更好?

  •  4
  • Todd Moses  · 技术社区  · 14 年前

    我正在做一个项目,在这个项目中,我必须在PHP中对数据数组执行计算。其中一些计算涉及使用多个数组。所有长度相同(计数)。

    问题 :将数据放入多维数组或保留在两个数组中是否更有效(内存和处理器使用情况)。

    请记住,其中一些数组可以有数千个值。

    例子 :为了更好地说明,以下是数据和用法的示例:

    x= 1,2,3,4,5

    y= 2,3,3,4,4

    计算x和y之间的相关性。

    这样做:

    1. 从列中获取x和y的总和
    2. 从列中获取x^2和y^2的总和
    3. 然后用相关公式计算

    我的想法 : 将两个数组组合成多维数组可以减少计算的迭代次数,但需要首先组合它们。

    所以我主要关心的是,创建一个多维数组并对其进行1X迭代需要更少的资源,还是最好保持它们分开并对每个数组进行迭代—进行2次迭代。

    还是有更好的方法对不涉及迭代的数组执行计算?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Orbling    14 年前

    如果您已经将数据作为两个单独的数组,那么首先合并它们将浪费时间和资源。

    PHP中有两种形式的数组访问,即迭代访问,它使用内部指针并按顺序访问,以及通过关联的键/索引(散列图而不是按顺序访问)进行访问。如果要查看数组的所有元素,并且可以按顺序执行,则尝试使用内置数组函数或迭代器函数reset()、next()、cur()、end()和each()迭代访问它。

    看看 array_reduce() 在PHP中,它可以帮助您快速实现这类事情。尽管在这个简单的例子中,您最好直接执行for()循环,并使用数组迭代器函数reset()、next()、cur()从每个数组中获取值,或者如果这些值的键控方式相同,您可以只执行for each()并使用其中一个的键。

    $sum_x = array_reduce($x, create_function('$x1,$x2', 'return $x1 + $x2;'), 0);
    $sum_y = array_reduce($y, create_function('$y1,$y2', 'return $y1 + $y2;'), 0);
    $sum_x2 = array_reduce($x, create_function('$x1,$x2', 'return $x1 + $x2 * $x2;'), 0);
    $sum_y2 = array_reduce($y, create_function('$y1,$y2', 'return $y1 + $y2 * $y2;'), 0);
    

    $sum_x = 0;
    $sum_y = 0;
    $sum_x2 = 0;
    $sum_y2 = 0;
    
    foreach (array_keys($x) as $i) {
      $sum_x += $x[$i];
      $sum_y += $y[$i];
      $sum_x2 += $x[$i] * $x[$i];
      $sum_y2 += $y[$i] * $y[$i];
    }
    
        2
  •  1
  •   Stephen    14 年前

    考虑到PHP中的所有数组都是散列表和关联数组,我认为最大的性能提升将是更少的迭代。我将使用多维数组。

        3
  •  1
  •   Mr. Smith    14 年前

    编写测试用例?您可以使用Pear来确定: http://pear.php.net/package/Benchmark

        4
  •  1
  •   dbkk    14 年前

    这不是特定于PHP的。 Locality of reference 因为缓存未命中很昂贵,所以数据常常很重要。

    例如,如果您正在处理并行数组中的项(全部 ?1 ,然后所有 ?2 …),在内存中将它们组织为:

    A1 B1 C1 ... A2 B2 C2 ... A3 B3 C3 ...
    

    而不是典型的:

    A1 A2 A3 ... B1 B2 B3 ... C1 C2 C3 ...
    

    当然,这取决于你的具体计算。将数据加载到第一个布局可能需要相当长的时间。最后,分析是唯一确定的方法。

        5
  •  0
  •   Sean    14 年前

    我看不出二维数组和二维一维数组之间的处理器或内存方面的区别。应该使用相同的内存量。它们是要有相同的数字还是元素?