Поиск всех подмножеств множества массивов (perl) - PullRequest
0 голосов
/ 08 июня 2018

У меня есть несколько массивов @ a1, @ a2, ... @ak (я не знаю, сколько).Я хотел бы создать массив, который содержит объединение наборов мощности массивов.т. е. некоторый массив находится в выходных данных, если и только если записи этого массива содержатся в @ai для некоторого i.Выходные данные не должны иметь дубликатов.

Единственный способ сделать это - создать массив, содержащий набор мощностей каждого из массивов, а затем объединить их.Тем не менее, при объединении я должен проверить на равенство при входе.

Есть ли что-нибудь лучше?

Что-то вроде: взять объединение всех массивов, взять набор мощности, а затемудалить вещи, которых там не должно быть, не будет работать, так как объединение массивов слишком велико.

РЕДАКТИРОВАТЬ: Например, предположим, что входные данные в (1,2), (2, 3, 4), то на выходе должны быть (), (1), (2), (3), (4), (1,2), (2,3), (3,4), (2,4), (2,3,4).Любой заказ будет приемлемым.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Чек 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)
0 голосов
/ 08 июня 2018
  • Используйте subsets из Algorithm::Combinatorics для генерации наборов мощности для каждого массива

  • Сортируйте элементы каждого подмножества так, чтобычто подмножества, содержащие одинаковые значения, образуют одну и ту же последовательность

  • Формируют строку из каждого отсортированного подмножества, скажем, разделяя их пробелами."@subset" сделает это за вас

  • Используйте строку в качестве ключа для хеш-элемента

  • Сделайте то же самое для всех массивов

  • Распечатать ключи хеша

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...