Given an array, how to generate all combinations of subset size k?

后端 未结 3 894
面向向阳花
面向向阳花 2021-01-06 15:16

So given input = [1, 2, 3] and k=2 this would return:

1 2
1 3
2 1
2 3
3 1
3 2

This is the closest to what I am lo

相关标签:
3条回答
  • 2021-01-06 15:29

    Instead of combinations, try permutations.

    Try generating permutations, then resizing the array.

    Here's it implemented, modified from here

    var permArr = [],
      usedChars = [];
    
    function permute(input, k) {
      var i, ch;
      for (i = 0; i < input.length; i++) {
        ch = input.splice(i, 1)[0];
        usedChars.push(ch);
        if (input.length == 0) {
          var toadd = usedChars.slice(0,k);
          if(!permArr.includes(toadd)) permArr.push(toadd); // resizing the returned array to size k
        }
        permute(input, k);
        input.splice(i, 0, ch);
        usedChars.pop();
      }
      return permArr
    };
    console.log(JSON.stringify(permute([1, 2, 3], 2)));

    0 讨论(0)
  • 2021-01-06 15:36

    A recursive solution to find k-subset permutations (in pseudo-code):

    kSubsetPermutations(partial, set, k) {
        for (each element in set) {
            if (k equals 1) {
                store partial + element
            }
            else {
                make copy of set
                remove element from copy of set
                recurse with (partial + element, copy of set, k - 1)
            }
        }
    }
    

    Here's a run-through for an example:

    input: [a,b,c,d,e]
    k: 3

    partial = [], set = [a,b,c,d,e], k = 3
        partial = [a], set = [b,c,d,e], k = 2
            partial = [a,b], set = [c,d,e], k = 1 -> [a,b,c], [a,b,d], [a,b,e]
            partial = [a,c], set = [b,d,e], k = 1 -> [a,c,b], [a,c,d], [a,c,e]
            partial = [a,d], set = [b,c,e], k = 1 -> [a,d,b], [a,d,c], [a,d,e]
            partial = [a,e], set = [b,c,d], k = 1 -> [a,e,b], [a,e,c], [a,e,d]
        partial = [b], set = [a,c,d,e], k = 2
            partial = [b,a], set = [c,d,e], k = 1 -> [b,a,c], [b,a,d], [b,a,e]
            partial = [b,c], set = [a,d,e], k = 1 -> [b,c,a], [b,c,d], [b,c,e]
            partial = [b,d], set = [a,c,e], k = 1 -> [b,d,a], [b,d,c], [b,d,e]
            partial = [b,e], set = [a,c,d], k = 1 -> [b,e,a], [b,e,c], [b,e,d]
        partial = [c], set = [a,b,d,e], k = 2
            partial = [c,a], set = [b,d,e], k = 1 -> [c,a,b], [c,a,d], [c,a,e]
            partial = [c,b], set = [a,d,e], k = 1 -> [c,b,a], [c,b,d], [c,b,e]
            partial = [c,d], set = [a,b,e], k = 1 -> [c,d,a], [c,d,b], [c,d,e]
            partial = [c,e], set = [a,b,d], k = 1 -> [c,e,a], [c,e,b], [c,e,d]
        partial = [d], set = [a,b,c,e], k = 2
            partial = [d,a], set = [b,c,e], k = 1 -> [d,a,b], [d,a,c], [d,a,e]
            partial = [d,b], set = [a,c,e], k = 1 -> [d,b,a], [d,b,c], [d,b,e]
            partial = [d,c], set = [a,b,e], k = 1 -> [d,c,a], [d,c,b], [d,c,e]
            partial = [d,e], set = [a,b,c], k = 1 -> [d,e,a], [d,e,b], [d,e,c]
        partial = [e], set = [a,b,c,d], k = 2
            partial = [e,a], set = [b,c,d], k = 1 -> [e,a,b], [e,a,c], [e,a,d]
            partial = [e,b], set = [a,c,d], k = 1 -> [e,b,a], [e,b,c], [e,b,d]
            partial = [e,c], set = [a,b,d], k = 1 -> [e,c,a], [e,c,b], [e,c,d]
            partial = [e,d], set = [a,b,c], k = 1 -> [e,d,a], [e,d,b], [e,d,c]
    

    function kSubsetPermutations(set, k, partial) {
        if (!partial) partial = [];                 // set default value on first call
        for (var element in set) {
            if (k > 1) {
                var set_copy = set.slice();         // slice() creates copy of array
                set_copy.splice(element, 1);        // splice() removes element from array
                kSubsetPermutations(set_copy, k - 1, partial.concat([set[element]]));
            }                                       // a.concat(b) appends b to copy of a
            else document.write("[" + partial.concat([set[element]]) + "] ");
        }
    }
    kSubsetPermutations([1,2,3,4,5], 3);

    0 讨论(0)
  • 2021-01-06 15:53

    I'm a simple person:

    make an array M with size k

    fill M with zeroes

    loop this:

    M[0] += 1

    loop through M: *if (M[i] >= size of N) then set M[i]=0 and increase M[i+1] += 1

    if M has only different numbers then you've find yourself the indices of a subset of n

    loop ends when the last element of M reaches size of n - minus one a.k.a. when the * condition would cause an error

    0 讨论(0)
提交回复
热议问题