LINUX.ORG.RU

Быстрая проверка на вхождение скаляра в массив

 ,


0

1

Предположим, есть массив

my @numbers = (19, 42, 23, 4, 10, 23);
и скаляр
my $number = 42;
Как быстро проверить, что значение скаляра есть в массиве? Хэши без значений?

★★★★★

Последнее исправление: int13h (всего исправлений: 1)
#!/usr/bin/env perl

my @numbers = (19, 42, 23, 4, 10, 23);
my $number = 42;
if ( grep( /^$number$/, @numbers ) ) {
  print "In array";
}
anonymous
()
Ответ на: комментарий от anonymous

perl -we 'my @numbers = (19, 42, 23, 4, 10, 23); my $number = 42; print «in array» if grep {$_ == $number} @numbers'

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Может лучше так:

#!/usr/bin/env perl
use strict;
use warnings;

my @numbers = (19, 42, 23, 4, 10, 23);
my $number = 42;

my %numhash = map { $_, $_ } @numbers;

print "in array\n" if exists $numhash{$number};
DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от DELIRIUM

«может», запросто, оба варианта вполне perlish. Надо решить что важней, процессор или память, выяснить насколько большой массив. Почти всегда хватает смарт-матчинга или фильтрации массива.

outtaspace ★★★
()
Ответ на: комментарий от outtaspace

Вообще говоря, если основная операция - это проверка вхождения значения, то массив - это неправильно выбранная структура данных.

DELIRIUM ☆☆☆☆☆
()

или timsort + бинарный поиск.

Deleted
()
Ответ на: комментарий от DELIRIUM

Все варианты в PP жрут немерянно ОЗУ. Если и брать массив чисел от 100 тыс. и более, то только через XS: Bit::Vector, Tie::IntegerArray и т.п. Конечно, пример у ТС даже оптимизировать не надо.

gh0stwizard ★★★★★
()
Ответ на: комментарий от int13h

Поскольку задача поставлена в общем виде, то можно использовать любой вариант выше (~~, grep, hash/map). Если нужно будет скорости, глянь Memoize. И если совсем приспичит, то Bit::Vector.

P.S. grep может работать и с операторами, а не только с рекспами, например, grep { $_ == 42 } @numbers.

gh0stwizard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.