2013-04-17 14 views
1

我有数组(A,B,C,D)。找到没有共同元素的组合

我选择了2个字母从上面4个字母组合使用组合公式

n!/r! (N-R)!

阵列(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组(应该是动态的),每个组应该有没有共同元素的数组(所有键应该是不同的,不应该重复单个元素)。

回答

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提供了很多set related functions for arrays

如果你只是想比较两个子集,使用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); 
} 
+0

它工作正常的小阵,但有什么办法来处理大阵?我有大小9845的数组。我想找出独特的组合。 – vishal

+0

为我的答案增加了一个比较示例。 – nibra

+0

它适用于数量较少的数组,但是当我们有大量的数组并有更多的数组元素时,它就不起作用。 – vishal