mirror of
https://github.com/trekhleb/javascript-algorithms.git
synced 2026-03-13 08:51:02 +08:00
Add backtracking solution for finding the power-set of a set.
This commit is contained in:
34
src/algorithms/sets/power-set/bwPowerSet.js
Normal file
34
src/algorithms/sets/power-set/bwPowerSet.js
Normal file
@@ -0,0 +1,34 @@
|
||||
/**
|
||||
* Find power-set of a set using BITWISE approach.
|
||||
*
|
||||
* @param {*[]} originalSet
|
||||
* @return {*[][]}
|
||||
*/
|
||||
export default function powerSet(originalSet) {
|
||||
const subSets = [];
|
||||
|
||||
// We will have 2^n possible combinations (where n is a length of original set).
|
||||
// It is because for every element of original set we will decide whether to include
|
||||
// it or not (2 options for each set element).
|
||||
const numberOfCombinations = 2 ** originalSet.length;
|
||||
|
||||
// Each number in binary representation in a range from 0 to 2^n does exactly what we need:
|
||||
// it shows by its bits (0 or 1) whether to include related element from the set or not.
|
||||
// For example, for the set {1, 2, 3} the binary number of 0b010 would mean that we need to
|
||||
// include only "2" to the current set.
|
||||
for (let combinationIndex = 0; combinationIndex < numberOfCombinations; combinationIndex += 1) {
|
||||
const subSet = [];
|
||||
|
||||
for (let setElementIndex = 0; setElementIndex < originalSet.length; setElementIndex += 1) {
|
||||
// Decide whether we need to include current element into the subset or not.
|
||||
if (combinationIndex & (1 << setElementIndex)) {
|
||||
subSet.push(originalSet[setElementIndex]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add current subset to the list of all subsets.
|
||||
subSets.push(subSet);
|
||||
}
|
||||
|
||||
return subSets;
|
||||
}
|
||||
Reference in New Issue
Block a user