1

我有数组(A,B,C,D)。

我使用组合公式从 6 个组合中的 4 个字母中选择 2 个字母

嗯!/r!(NR)!

数组(A,B),数组(A,C),数组(A,D),数组(B,C),数组(B,D),数组(C,D)

我怎样才能找到没有共同字母的 2 或 3 或 n 组(应该是动态的)的组合。所以我希望结果低于 2 组的组合,

数组(A,B),数组(C,D)

数组(A,C),数组(B,D),

数组(A,D),数组(B,C),

这只是一个示例,但我希望该算法适用于大量数组(我有超过 35000 个数组)。我想找到 2 或 3 或 n 组(应该是动态的),每个组都应该有没有共同元素的数组(所有键应该不同,而不应该重复单个元素)。

4

1 回答 1

2

你没有说集合是如何表示的,所以我使用数组来达到这个目的。

// The base set
$baseSet = array('A', 'B', 'C', 'D');

// Build the subsets
$subSets = array();
for ($i = 0; $i < 3; $i++) {
    for ($j = $i+1; $j< 4; $j++) {
        $subSets[] = array($baseSet[$i], $baseSet[$j]);
    }
}

有了这个,解决方案很简单:

foreach ($subSets as $subSet) {
    $complement = array_diff($baseSet, $subSet);
    printf("{%s, %s} - {$s, %s}\n",
        $baseSet[0], $baseSet[1],
        $complement[0], $complement[1]
    );
}

一般来说,PHP 提供了很多与数组相关的集合函数

如果您只想比较两个子集,请使用array_intersect()

$common = array_intersect($subSet1, $subSet2);
if (empty($common)) {
    echo 'The subsets are distinct.';
} else {
    echo 'The subsets have these elements in common: ' . implode(', ', $common);
}
于 2013-04-17T11:07:03.357 回答