查找一组数组的所有子集 (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)