アルゴリズム毎週質問006:組み合わせの多く

問題:

以下の3人のチームでは、各チームが2人の選手を持っています。
TEAM1:A、B、
Team2:C、D;
team3:E、F .;

今探るためにチームを形成するために、一人のうち、各チームは、チームアプローチのすべてを記入してください。

アイデア:

これは、問題の組み合わせで、各チームが人を選ぶ、それは2の合計でなければなりません2 2 = 8の可能な組み合わせ。
暴力は、3つのネストされたループを解決する場合。しかし、問題は10チーム、10人の各チームに拡張するものならば、暴力は、少なくともコードはスケーラブルではありません、解決することはできません。

アイデアがあり、次のとおりです。

すべてのチーム循環
最初の抽出A、B二人のプレイヤーは、アップ維持;
第二の抽出C、D二人、およびACを与えるために、組成物を保存することができるフロントクロスメンバ、AD、BC、BD4種組み合わせ、その後追いつい;
第三の抽出E、Fは、二人のプレイヤーは、ACEを与えるために、前のラウンドクロス組成物の結果を保存することができ、ACF、ADE、ADF、 BCE、BCF、BDE、BDF。
などなど。

すべての組み合わせが完了するまでトラバース各サイクルは、ラウンド組み合わせた選手や元選手の現在のラウンドの前になります。

回答:

PHP

<?php
function getCombinations($arrays) {
    $result = array(array());
    foreach ($arrays as $property => $property_values) {
        $tmp = array();
        foreach ($result as $result_item) {
            foreach ($property_values as $property_value) {
                $tmp[] = array_merge($result_item, array($property => $property_value));
            }
        }
        $result = $tmp;
    }
    return $result;
}

$combinations = getCombinations(
    array(
        'item1' => array('A', 'B'),
        'item2' => array('C', 'D'),
        'item3' => array('E', 'F'),
    )
);
$rs = $combinations;
print_r($rs);

出力:

Array
(
    [0] => Array
        (
            [item1] => A
            [item2] => C
            [item3] => E
        )

    [1] => Array
        (
            [item1] => A
            [item2] => C
            [item3] => F
        )

    [2] => Array
        (
            [item1] => A
            [item2] => D
            [item3] => E
        )

    [3] => Array
        (
            [item1] => A
            [item2] => D
            [item3] => F
        )

    [4] => Array
        (
            [item1] => B
            [item2] => C
            [item3] => E
        )

    [5] => Array
        (
            [item1] => B
            [item2] => C
            [item3] => F
        )

    [6] => Array
        (
            [item1] => B
            [item2] => D
            [item3] => E
        )

    [7] => Array
        (
            [item1] => B
            [item2] => D
            [item3] => F
        )

)

golang:

package main

import "fmt"

func main() {
    // 三组数据,每组选一个进行组合,总数应是2*2*2
    d := make(map[string][]string)
    d["item1"] = []string{"A", "B"}
    d["item2"] = []string{"C", "D"}
    d["item3"] = []string{"E", "F"}

    rs := getCombinations(d)
    fmt.Println(rs)
}

// 取得组合列表
func getCombinations(data map[string][]string) [][]map[string]string {
    result := make([][]map[string]string, 1)
    for property, propertyValues := range data {
        tmp := make([][]map[string]string, 0)
        for _, resultItem := range result {
            for _, propertyValue := range propertyValues {
                tmp = append(tmp, append(resultItem, map[string]string{property: propertyValue}))
            }
        }
        result = tmp
    }
    return result
}

微調整:(出力フォーマット)

[[map[item1:A] map[item2:C] map[item3:E]]
[map[item1:A] map[item2:C] map[item3:F]] 
[map[item1:A] map[item2:D] map[item3:E]] 
[map[item1:A] map[item2:D] map[item3:F]] 
[map[item1:B] map[item2:C] map[item3:E]] 
[map[item1:B] map[item2:C] map[item3:F]]
[map[item1:B] map[item2:D] map[item3:E]]
[map[item1:B] map[item2:D] map[item3:F]]]

おすすめ

転載: blog.51cto.com/ustb80/2426089
おすすめ