我有一堆数组@ 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) 。任何订单都是可以接受的。
答案 0 :(得分:3)
检查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)
答案 1 :(得分:-1)
使用Algorithm::Combinatorics
中的subsets
生成每个阵列的电源设置
对每个子集的成员进行排序,以便包含相同值的子集形成相同的序列
从每个已排序的子集中形成一个字符串,例如将它们用空格分隔。 "@subset"
会为您做到这一点
使用字符串作为哈希元素的键
对所有数组执行相同的操作
打印哈希的键