2013-04-17 17 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