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


with scarf

So given input = [1, 2, 3], k=2it will return:

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

This is the closest thing I've looked for, but it's not quite the same : http://algorithms.tutorialhorizon.com/print-all-combinations-of-subset-of-size-k-from-given-array /

function subsetsOfSize(a, used, startIndex, currentSize, k) {
  if (currentSize === k) {
    for (var i = 0; i < a.length; i++) {
      if (used[i])
        console.log(a[i]);
    }
    console.log('-');
    return;
  }
    
  if (startIndex === a.length)
    return;
    
  used[startIndex] = true;
  subsetsOfSize(a, used, startIndex+1, currentSize+1, k);

  used[startIndex] = false;
  subsetsOfSize(a, used, startIndex+1, currentSize, k);
}

var input = [1,2,3];
subsetsOfSize(input, Array(input.length).fill(false), 0, 0, 2);

^Missing results such as 2 1, 3 1, 3 2etc.

Second, I'm not sure if I've named this question correctly, as the "all combinations of subsets of size k" solution does not give the expected answer.

m69 ``Dryness is not welcome''

Find recursive solutions for k subset permutations (in pseudocode):

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 is a sample 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);

Related


php generate all combinations from a given array

Larry 13 What is the easiest way to convert this PHParray $a = array('A' => array(1, 2), 'B' => array(3, 4), 'C' => array(5)); to this: $result = array( array('A' => 1, 'B' => 3, 'C' => 5), array('A' => 1, 'B' => 4, 'C' => 5),

php generate all combinations from a given array

Larry 13 What is the easiest way to convert this PHParray $a = array('A' => array(1, 2), 'B' => array(3, 4), 'C' => array(5)); to this: $result = array( array('A' => 1, 'B' => 3, 'C' => 5), array('A' => 1, 'B' => 4, 'C' => 5),

How to generate all possible combinations of a given length

Himek Suppose we have a price list items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]. We want to find all possible combinations of putting all 7 prices into buckets, each containing the following number of prices [3, 2, 2]. It doesn't matter if the pri

How to generate all possible combinations of a given length

Himek Suppose we have a price list items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]. We want to find all possible combinations of putting all 7 prices into buckets, each containing the following number of prices [3, 2, 2]. It doesn't matter if the pri

How to generate all possible combinations of a given length

Himek Suppose we have a price list items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]. We want to find all possible combinations of putting all 7 prices into buckets, each containing the following number of prices [3, 2, 2]. It doesn't matter if the pri

How to generate all possible combinations of a given length

Himek Suppose we have a price list items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]. We want to find all possible combinations of putting all 7 prices into buckets, each containing the following number of prices [3, 2, 2]. It doesn't matter if the pri

How to generate all possible combinations of a given length

Himek Suppose we have a price list items_prices = [1500, 2000, 1600, 2100, 2200, 1400, 1900]. We want to find all possible combinations of putting all 7 prices into buckets, each containing the following number of prices [3, 2, 2]. It doesn't matter if the pri