查找一组数组的所有子集(perl)

时间:2018-06-08 17:34:11

标签: arrays perl powerset

我有一堆数组@ 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) 。任何订单都是可以接受的。

2 个答案:

答案 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"会为您做到这一点

  • 使用字符串作为哈希元素的键

  • 对所有数组执行相同的操作

  • 打印哈希的键