【问题标题】:Print all combination of sub range within a given array打印给定数组中子范围的所有组合
【发布时间】:2017-03-23 18:06:02
【问题描述】:

我想打印给定数组中子范围的所有组合。我有一个包含 y 个元素的数组,我想从中打印所有连续子范围的组合。

约束是:每个子范围应该至少有 2 个元素,并且子范围中的每个元素应该是连续的。它应该共享每个元素的相同边框。

例如,我们有一个由 7 个元素组成的数组 [11,12,13,14,11,12,13]

所以,子范围组合的总数将[7 * (7-1) /2] = 21

所以,输出将是这样的:

11,12

12,13

13,14

14,11

11,12

12,13

11,12,13

12,13,14

13,14,11

...

11,12,13,14 and so on (total 21 combination as per above array)

我们不应该打印任何不连续的组合。示例:[11,12,14] 不是有效的组合,因为它跳过了中间的元素“13”。

我能够打印包含 2 个元素的组合,但我很难打印超过 2 个元素的组合。

以下是我目前尝试过的。

$data=array("11","12","13","14","11","12","13");
$totalCount=count($data);

for($i=0;$i<$totalCount;$i++){
    if(($i+1) < ($totalCount)){
        echo "[".$data[$i].",".$data[$i+1]."]<br>";
    }
}

【问题讨论】:

  • @LucasMendes 它不重复。我希望组合是连续的。就像上面的例子一样,[11,12,14] 不是有效的组合,因为它不是不连续的,并且会跳过中间的元素“13”。每个组合中的元素应共享相同的边框。
  • @ViditMody,在您的示例中,您正在打印所有组合。您应该编辑您的问题以包含正确的示例输出。

标签: php arrays algorithm


【解决方案1】:

你可以这样做:

$arr = [11,12,13,14,11,12,13];

function genComb($arr, $from = 1, $to = -1) {
    $arraySize = count($arr);
    if ($to == -1) $to = $arraySize;
    $sizeLimit = $to + 1;
    for ($i = $from; $i < $sizeLimit; $i++) { // size loop
        $indexLimit = $arraySize - $i + 1;
        for ($j = 0; $j < $indexLimit; $j++) { // position loop
            yield array_slice($arr, $j, $i);
        }
    }
}

$count = 0;
foreach (genComb($arr, 2) as $item) {
    echo implode(',', $item), PHP_EOL;
    $count++;
}

echo "total: $count\n";

【讨论】:

  • 谢谢@Casimir。像魅力一样工作。 :)
【解决方案2】:

Casimir et Hippolyte 更快,但您可以通过独立处理每个连续部分来获得巨大的性能:

function getCombos(&$data) {
    $combos = array();
    $count = count($data);
    $i = 0;
    while ($i < $count) {
        $start = $i++;
        while ($i < $count && $data[$i - 1] + 1 == $data[$i]) // look for contiguous items
            $i++;
        if ($i - $start > 1) // only add if there are at least 2
            addCombos($data, $start, $i, $combos); // see other answer
    }
    return $combos;
}

【讨论】:

  • 谢谢@maraca。您正在调用 addCombos() 函数。但是该函数在哪里定义。另外,您的评论说请参阅其他答案。你能告诉我哪个答案吗?谢谢
猜你喜欢
  • 1970-01-01
  • 2013-02-13
  • 2013-01-04
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多