2011-12-19 91 views
1

說我的名單是 {1,2,3,4}尋找雙打(有兩個元素)從列表中的所有組合

我的標題可能不具有足夠的描述,但這裏是我想要做的.. 我想我的代碼生成以下

{ (1,2) , (3,4) }

{ (1,3) , (2,4) }

{ (1,4) , (2,3) }

{ (2,1) , (4,3) }

{ (3,1) , (4,2) }

{ (4,1) , (3,2) }

即我希望所有集合的4C2組合。

注:此處的初始四個要素僅僅是說明性的數目..數量可以變化uptill 8或10

現在,我怎樣寫它的代碼(在C或php)。

基本上,我想知道算法。不是整個它,甚至一個headstart將是足夠好.. 我只是不能想到任何事情從頭開始。 請幫忙。 謝謝。

我猜我沒有解釋清楚;其實我自己並沒有得到這個問題。 我想要的是,說我有4支球隊,我想打另一支球隊,那麼我如何生成所有的裝備。在我上面的示例中爲 ;將1,2,3,4視爲4支球隊。和( {(1,2),(3,4)}作爲一組固定裝置等。 我該如何做到這一點。 因此我需要的是生成所有的NC2 /(N/2)套裝。 (在這種情況下N = 4)

+1

它會一直是'nC2'還是它可能是'nCr'? – st0le 2011-12-19 06:06:14

+2

你可以修改這個問題的答案:http://stackoverflow.com/questions/1435552/php-array-combination – 2011-12-19 06:07:40

+0

@ st0le nc2 only。 – Kraken 2011-12-19 06:08:58

回答

2

基本上,我想知道算法。不是整個它,即使是一個 headstart將足夠好..我只是不能想到任何東西開始 從。

如果您想要headstart,Python文檔將顯示用於實現組合函數的算法。用一個普通的for循環和收率的printf替換的範圍()和它應該很容易轉化爲C或PHP:http://docs.python.org/library/itertools.html#itertools.combinations

注意在時間產量採取了兩個四對事物的組合:(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)。您的樣本輸出還包括每個的補充(即(1, 2)伴隨着(3, 4))。

+0

編輯完成。請幫助! 謝謝。 – Kraken 2011-12-19 14:23:33

1

我做了這個(PHP)。我添加了第三個參數,可以使函數返回每個可能的組合,而不管元素的順序是否重要。初始選項集和返回組合將是數組

function every_combinations($set, $n, $order_matters = false) { 
    $combinations = []; 
    foreach($set AS $k => $e) { 
     $subset = $set; 
     unset($subset[$k]); 
     if($n == 1) $combinations[] = [$e]; 
     else { 
      $subcomb = every_combinations($subset, $n - 1, $order_matters); 
      foreach($subcomb AS $s) { 
       $comb = array_merge([$e], $s); 
       if($order_matters) $combinations[] = $comb; 
       else { 
        $needle = $comb; 
        sort($needle); 
        if(!in_array($needle, $combinations)) $combinations[] = $comb; 
       } 
      } 
     } 
    } 
    return $combinations; 
} 
相關問題