Генерация всех возможных комбинаций - PullRequest
61 голосов
/ 22 июня 2010

Учитывая 2 массива Array1 = {a,b,c...n} и Array2 = {10,20,15....x}, как я могу генерировать все возможные комбинации в виде строк a (i) b (j) c (k) n (p) , где

1 <= i <= 10,  1 <= j <= 20 , 1 <= k <= 15,  .... 1 <= p <= x

Например:

a1 b1 c1 .... n1  
a1 b1 c1..... n2  
......  
......  
a10 b20 c15 nx (last combination)

Таким образом, во всем общем количестве комбинаций = произведение элементов на array2 = (10 X 20 X 15 X ..X x)

Похоже на декартово произведение, в котором второй массив определяетверхний предел для каждого элемента в первом массиве.

Пример с фиксированными числами,

    Array x =  [a,b,c]
    Array y =  [3,2,4] 

Таким образом, у нас будет 3 * 2 * 4 = 24 комбинации.Результаты должны быть:

    a1 b1 c1  
    a1 b1 c2  
    a1 b1 c3  
    a1 b1 c4  

    a1 b2 c1  
    a1 b2 c2  
    a1 b2 c3  
    a1 b2 c4


    a2 b1 c1  
    a2 b1 c2  
    a2 b1 c3  
    a2 b1 c4  

    a2 b2 c1  
    a2 b2 c2  
    a2 b2 c3  
    a2 b2 c4


    a3 b1 c1  
    a3 b1 c2  
    a3 b1 c3  
    a3 b1 c4  

    a3 b2 c1  
    a3 b2 c2  
    a3 b2 c3  
    a3 b2 c4 (last)

Ответы [ 11 ]

0 голосов
/ 23 марта 2014

Вот версия javascript, которую, я уверен, кто-то может конвертировать. Он был тщательно проверен.

Вот скрипка .

function combinations (Asource){

    var combos = [];
    var temp = [];

    var picker = function (arr, temp_string, collect) {
        if (temp_string.length) {
           collect.push(temp_string);
        }

        for (var i=0; i<arr.length; i++) {
            var arrcopy = arr.slice(0, arr.length);
            var elem = arrcopy.splice(i, 1);

            if (arrcopy.length > 0) {
                picker(arrcopy, temp_string.concat(elem), collect);
            } else {
                collect.push(temp_string.concat(elem));
            }   
        }   
    }

    picker(Asource, temp, combos);

    return combos;

}

var todo = ["a", "b", "c", "d"]; // 5 in this set
var resultingCombos = combinations (todo);
console.log(resultingCombos);
...