在PHP中优化从数组生成一对数组而不重复

时间:2017-05-04 03:04:00

标签: php algorithm optimization

我从一维数组生成一大堆对,代码必须严格检查并消除所有重复(即如果[1,2]存在,则不生成[2,1]) 。例如:

arr = [1,2,3]
pairs = [[1,2],[1,3],[2,3]]

我的解决方案目前需要60秒才能生成大小为N = 460的数组(结果将在110,000对左右)。代码如下:

private function generateAllCombination($scripts)
{
    $combinations = [];
    $pairsIndex = '';

    for ($i = 0; $i < count($scripts) - 1; $i++) {
        for ($j = 0; $j < count($scripts); $j++) {
            // pairs must consist of tuples with distinct values
            if ($i != $j) {
                $pair = array(
                    $scripts[$i],
                    $scripts[$j]
                );

                // only add unique tuples
                $pairTuple = '[' . $i . ',' . $j. ']';
                $pairTupleRev = '[' . $j . ',' . $i . ']';

                if (strpos($pairsIndex, $pairTuple) === false) {
                    $combinations[] = $pair;

                    if ($j > $i) {
                        $pairsIndex .= $pairTupleRev;
                    }
                }
                else {
                    $pairsIndex = str_replace($pairTuple, '', $pairsIndex);
                }
            }
        }
    }

    return $combinations;
}

我认为检查重复项是在2D嵌套循环中将其删除,但不确定如何有效地优化它。任何建议都会非常感激。

1 个答案:

答案 0 :(得分:2)

如果arr不包含重复项,那么您只需从下一个索引开始第二个循环:

for ($i = 0; $i < count($scripts) - 1; $i++) {
      for ($j = $i + 1; $j < count($scripts); $j++) {
            //no need to check, just make a pair