查找一组数组的所有子集 (perl)
Finding all subsets of a set of arrays (perl)
我有一堆数组 @a1, @a2, ... @ak(我不知道有多少)。我想创建一个包含数组幂集并集的数组。即,当且仅当该数组的条目包含在某些 i 的@ai 中时,某些数组才会出现在输出中。输出不应重复。
我能想到的唯一方法是创建一个包含每个数组的幂集的数组,然后合并它们。但是,合并时,我必须检查条目是否相等。
还有更好的吗?
类似的,取所有数组的并集,取幂集,然后删除不应该在那里的东西是行不通的,因为数组的并集太大了。
编辑:
例如,假设输入在(1,2), (2, 3, 4),那么输出应该是
(), (1), (2), (3), (4), (1,2), (2,3), (3,4), (2,4), (2,3,4) .任何订单都可以接受。
使用 Algorithm::Combinatorics
中的 subsets
为每个数组生成幂集
对每个子集的成员进行排序,使包含相同值的子集形成相同的序列
从每个排序的子集中形成一个字符串,比如用空格分隔它们。 "@subset"
会为你做的
使用字符串作为哈希元素的键
对所有数组做同样的事情
打印散列的键
勾选https://metacpan.org/pod/List::PowerSet
use strict;
use warnings;
use List::PowerSet 'powerset_lazy';
my @arr = (
[1,2],
[2,3,4],
);
my %hash;
for my $v (@arr) {
my $ps = powerset_lazy(@$v);
while (my $set = $ps->()) {
my $str = join ",", @$set;
next if $hash{$str}++;
print "($str)\n";
}
}
输出
(1,2)
(2)
(1)
()
(2,3,4)
(3,4)
(2,4)
(4)
(2,3)
(3)
我有一堆数组 @a1, @a2, ... @ak(我不知道有多少)。我想创建一个包含数组幂集并集的数组。即,当且仅当该数组的条目包含在某些 i 的@ai 中时,某些数组才会出现在输出中。输出不应重复。
我能想到的唯一方法是创建一个包含每个数组的幂集的数组,然后合并它们。但是,合并时,我必须检查条目是否相等。
还有更好的吗?
类似的,取所有数组的并集,取幂集,然后删除不应该在那里的东西是行不通的,因为数组的并集太大了。
编辑: 例如,假设输入在(1,2), (2, 3, 4),那么输出应该是 (), (1), (2), (3), (4), (1,2), (2,3), (3,4), (2,4), (2,3,4) .任何订单都可以接受。
使用
Algorithm::Combinatorics
中的subsets
为每个数组生成幂集对每个子集的成员进行排序,使包含相同值的子集形成相同的序列
从每个排序的子集中形成一个字符串,比如用空格分隔它们。
"@subset"
会为你做的使用字符串作为哈希元素的键
对所有数组做同样的事情
打印散列的键
勾选https://metacpan.org/pod/List::PowerSet
use strict;
use warnings;
use List::PowerSet 'powerset_lazy';
my @arr = (
[1,2],
[2,3,4],
);
my %hash;
for my $v (@arr) {
my $ps = powerset_lazy(@$v);
while (my $set = $ps->()) {
my $str = join ",", @$set;
next if $hash{$str}++;
print "($str)\n";
}
}
输出
(1,2)
(2)
(1)
()
(2,3,4)
(3,4)
(2,4)
(4)
(2,3)
(3)