Разница двух массивов с использованием Perl

Если действие каждой комбинации статично, вы можете построить двумерный массив:

var data = [
  [1,2,3,4,5],
  [6,7,8,9,10],
  [11,12,13,14,15],
  [16,17,18,19,20],
  [21,22,23,24,25]
];

Числа в приведенном выше примере могут быть любыми, такими как строка, массив и т. д. Извлечение значение теперь однострочное (если ползунки имеют диапазон значений [0,5]:

var info = data[firstSliderValue][secondSliderValue];
34
задан Eugen Konkov 12 September 2016 в 00:57
поделиться

3 ответа

Другой способ сделать это - использовать Array :: Utils

use Array::Utils qw(:all);

my @a = qw( a b c d );
my @b = qw( c d e f );

# symmetric difference
my @diff = array_diff(@a, @b);

# intersection
my @isect = intersect(@a, @b);

# unique union
my @unique = unique(@a, @b);

# check if arrays contain same members
if ( !array_diff(@a, @b) ) {
        # do something
}

# get items from array @a that are not in array @b
my @minus = array_minus( @a, @b );
39
ответ дан 27 November 2019 в 16:16
поделиться

Вам нужно предоставить гораздо больше контекста. Есть более эффективные способы сделать это, начиная от:

  • Выйти за пределы Perl и использовать shell (sort + comm)

  • map один массив в Perl хэш, а затем перебрать другой, проверяя принадлежность хэша. Это имеет линейную сложность ("M+N" - в основном цикл по каждому массиву один раз) в отличие от вложенного цикла, который имеет сложность "M*N")

    Пример:

    my %second = map {$_=>1} @second;
    my @only_in_first = grep { !$second{$_} } @first; 
    # используйте цикл foreach с `last` вместо "grep" 
    # если вам нужен только ответ "да/нет" вместо полного списка
    
  • Используйте модуль Perl, который делает последний пункт за вас (List::Compare был упомянут в комментариях)

  • Делайте это на основе временных меток, когда элементы были добавлены, если объем очень большой и вам нужно часто пересчитывать. Несколько тысяч элементов - это не очень большой объем, но недавно мне пришлось сравнивать списки размером в 100 тысяч.

11
ответ дан 27 November 2019 в 16:16
поделиться

perlfaq4 на помощь:

Как вычислить разность двух массивов? Как вычислить пересечение двух массивов?

Используйте хэш. Вот код, позволяющий сделать и то, и другое, и даже больше. Он предполагает, что каждый элемент уникален в данном массиве:

 @union = @intersection = @difference = ();
 %count = ();
 foreach $element (@array1, @array2) { $count{$element}++ }
 foreach $element (keys %count) {
 push @union, $element;
 push @{ $count{$element} > 1 ? \@пересечение : \@difference }, $element;
 }

Если вы правильно объявите свои переменные, код будет выглядеть следующим образом:

my %count;
for my $element (@array1, @array2) { $count{$element}++ }

my ( @union, @intersection, @difference );
for my $element (keys %count) {
    push @union, $element;
    push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
}
25
ответ дан 27 November 2019 в 16:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: