У меня есть набор наборов.Я хочу создать все наборы, которые принимают не более одного элемента из каждого исходного набора.Например, если мой исходный набор наборов ((x,y),(A),(1,2))
, то решения:
(x)
(y)
(A)
(1)
(2)
(x,A)
(x,1)
(x,2)
(y,A)
(y,A)
(y,1)
(y,2)
(A,1)
(A,2)
(x,A,1)
(x,A,2)
(y,A,1)
(y,A,2)
Я использую следующий код, который я написал, чтобы рекурсивно вычислить это:
# gets an array of arrays (aoa)
# returns an array of arrays with all subsets where zero or one element is
# taken from each array, e.g. in = [[a,b],[5],[X,Y,Z]], out =
# [[],[a],[b],[5],[X],[Y],[Z],[a,5],[b,5],[a,X],[a,Y],...,[b,5,Y],[b,5,Z]]
# note the order of elelemnts in each arry is immaterial (an array is
# considered an unordered set)
sub sets_aoa_to_subsets_aoa {
my $aoa = shift // confess;
if ( scalar( @{$aoa} ) == 0 ) {
return [ [] ];
}
my $a = shift @{$aoa};
my $subsets_aoa = sets_aoa_to_subsets_aoa($aoa);
my @new_subsets = ();
foreach my $subset_a ( @{$subsets_aoa} ) {
# leave subset as-is
push @new_subsets, $subset_a;
# add one element from $a
foreach my $e ( @{$a} ) {
push @new_subsets, [ $e, @{$subset_a} ];
}
}
return \@new_subsets;
}
однакоЯ хотел бы добавить ограничение на размер подмножества.Например, если я установлю max_size=2
, последние четыре решения будут проигнорированы.Я не могу просто сгенерировать все решения, а затем отфильтровать тех, кто слишком велик, так как иногда у меня есть более 100 наборов, каждый из которых содержит 2-3 элемента, и 2 ^ 100 не очень удобно для обработки, особенно когда я хочу только подмножествразмер 5 или меньше.