在Perl中的数组中进行二进制搜索

时间:2011-01-13 08:51:31

标签: perl binary-search

我有一个十六进制数字数组,我需要查看其他数字并检查它们是否出现在该数组中。现在我正在使用一个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
      }
}

2 个答案:

答案 0 :(得分:21)

答案 1 :(得分:0)

如果您只是进行一次搜索,那么排序将比执行单次线性扫描花费更长的时间,因此您可以坚持在数组上进行循环。对于小型数组,或者如果您可以有多个匹配项,您可能还需要查看grep函数;它更容易使用,但它总是检查候选匹配的整个列表,而不是在找到匹配时停止。

如果你要多次搜索,将数组的值放入哈希并进行哈希查找将比搜索数组更快,即使你对它进行排序并进行二进制搜索(假设你能负担得起内存)成本,但你几乎可以肯定。)