I recently needed to generate a powerset (a set of all subsets) of 3 HTML select boxes. The idea was that a user could choose 1-many options from each box, and they had to choose a value from all 3 boxes (none could be empty).
Select #1 had 4 values
Select #2 had 7 values
Select #3 had 13 values
Now, I needed to generate every possible permutation for these 3 select boxes based on the rules I defined above. That meant the possible number of combinations for each box was:
Select #1 had 16* possible combinations
Select #2 had 128* possible combinations
Select #3 had 8192* possible combinations
* It was actually 1 less than that, because a powerset take into consideration an empty selection, so in reality the numbers would have been 15, 127 and 8191.
This was calculated using 2n, where n is an number (integer) of options in a set, so 24, 27 and 213
Now, how did I go about calculating these powersets? I cheated :smile:
I grabbed a JavaScript function from Rosetta Code and ported it to ColdFusion.
Here is the function to generate a powerset from a set (array) of data:
public array function calculate(required array data)
{
var ps = [""];
var d = arguments.data;
var lenData = arrayLen(d);
var lenPS = 0;
for (var i=1; i LTE lenData; i++)
{
lenPS = arrayLen(ps);
for (var j = 1; j LTE lenPS; j++)
{
arrayAppend(ps, listAppend(ps[j], d[i]));
}
}
return ps;
}
A sample powerset of 4 values (in this case 1,2,3,4) would be:
var Powerset = new Powerset();
var res = Powerset.calculate([1,2,3,4]);
Outputs:
["","1","2","1,2","3","1,3","2,3","1,2,3","4","1,4","2,4","1,2,4","3,4","1,3,4","2,3,4","1,2,3,4"]
By the way, my total combination across all 3 sets was a mere 16,777,216.
Grab from github if you prefer the CFC