PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 129


Решение

В приведенных ниже решениях списки инициализируются следующим образом:

@а = (1,   3,   5,   6,   7,   8), (s>b = (2,   3,   5    7,   9),

@umon = (Sisect = @diff = (), %umon = %isect = (), %count =(),

Простое решение для объединения и пересечения

foreach $е(@а)  {  $union{$e} = 1  }

foreach $e (@b)  {

if ( $umon{$e}  )  { $isect{$e} = 1  }

$umon {$e} = 1, >

@umon = keys %umon, @>isect = keys %isect,

Идиоматическое решение

foreach $e (@a,  @b)  { $umon{$e}++ && $isect{$e}++ }

@union = keys %umons, @isect = keys %isect,


130   Глава 4 • Массивы

Объединение, пересечение и симметричная разность

foreach $e (@a,  §b)  {  $count{$e}++ }

foreach $e (keys %count)  { push(@umon,   $e), if ($count{$e} == 2)  {

push @isect,   $e, } else {

push @diff,   $e,

Косвенное решение

@isect = @diff = @umon = (),

foreach $e (@a,  @b)  {  $count{$e}++ }

foreach $e (keys %count)  { push(@umon,  $e), push @{ $count{$e} == 2 ? \@isect     \@diff    },

Комментарий

В первом решении происходит непосредственное вычисление объединения и пересечения двух списков, ни один из которых не содержит дубликатов. Для за­писи элементов, принадлежащих к объединению и пересечению, используются два разных хэша. Сначала мы заносим каждый элемент первого массива в хэш объединения и ассоциируем с ним истинное значение. Затем при последователь­ной обработке элементов второго массива мы проверяем, присутствует ли эле­мент в объединении. Если присутствует, он также включается и в хэш пересече­ния. В любом случае элемент заносится в хэш объединения. После завершения перебора мы извлекаем ключи обоих хэшей. Ассоциированные с ними значения не нужны.

Второе решение («Идиоматическое») в сущности делает то же самое, однако для него потребуется хорошее знание операторов Perl (а также awk, С, C++ и Java) ++ и &&. Если ++ находится после переменной, то ее старое значение используется до приращения. Когда элемент встречается впервые, он еще отсутствует в объе­динении, поэтому первая часть && будет ложной, а вторая часть попросту игно­рируется. Когда тот же элемент встретится во второй раз, он уже присутствует в объединении, поэтому мы заносим его и в пересечение.




- Начало -  - Назад -  - Вперед -