我有一个十六进制数字数组,我需要查看其他数字并检查它们是否出现在该数组中。现在我正在使用一个foreach
循环,每次遍历整个数组。有没有办法通过首先对数组进行排序,然后在其上实现二进制搜索来加快速度。
目前的代码:
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
}
}
答案 0 :(得分:21)
答案 1 :(得分:0)
如果您只是进行一次搜索,那么排序将比执行单次线性扫描花费更长的时间,因此您可以坚持在数组上进行循环。对于小型数组,或者如果您可以有多个匹配项,您可能还需要查看grep
函数;它更容易使用,但它总是检查候选匹配的整个列表,而不是在找到匹配时停止。
如果你要多次搜索,将数组的值放入哈希并进行哈希查找将比搜索数组更快,即使你对它进行排序并进行二进制搜索(假设你能负担得起内存)成本,但你几乎可以肯定。)