У меня есть массив шестнадцатеричных чисел, и мне нужно перебирать другие числа и проверять, отображаются ли они в этом массиве. Прямо сейчас я использую цикл foreach
, который каждый раз проходит по всему массиву. Есть ли способ сделать это быстрее, сначала отсортировав массив, а затем реализуя на нем двоичный поиск.бинарный поиск в массиве в Perl
Код на данный момент:
sub is_bad_str{
my ($str, @keys) = @_;
my $flag = 0;
my ($key, $hex_num);
if ($str =~ m/14'h([0-9a-f][0-9a-f][0-9a-f][0-9a-f])/;){ #'# fixes bad highlighting
$hex_num = $1;
}
if (defined $hex_num){
foreach $key (@keys){
if ($hex_num =~ /\Q$key\E/i){
$flag = 1;
last;
}
}
}
if (($flag == 0) && (defined $hex_num)){
return 1;#Bad str
}else{
return 0;#Good str
}
}
У вас есть очень тонкая ошибка там. Переменная match '$ 1' не является * reset *, поэтому, как только она определена, она будет оставаться определенной, независимо от того, существует ли регулярное выражение. Вы должны проверить, определено ли 'x = ~ y', чтобы определить, было ли совпадение – Dancrumb
Это домашнее задание? Если это так, это одно: если нет, вы должны использовать модуль CPAN для этого. – Dancrumb
Это не домашнее задание. Какая именно модель? Я проверил список моделей, и, похоже, нет бинарной модели поиска. – SIMEL