计算数组中所有元素出现在字符串中的最快方法是什么?

时间:2015-02-04 23:49:55

标签: arrays perl string-matching

我有一个字符串($info),看起来像这样:

$info = "Complete1:1,ATTCGGCTAGGGCTAGCTAGCTAG,Complete1:2,ATTTGAGAGGGATCGCGCCAT,..."

一个看起来像这样的数组(@codes):

@codes = ("ACTTTCGGGGCATCGGATCG", "ATTGCATGGGCATGGCATGGCATG", "ACGGGATGGGCATGCTAG",...);

数组@codes包含一些与$info(一个或多个)部分匹配的元素以及一些与$info不匹配的元素。

计算@codes中所有元素匹配字符串$info的次数的最快方法是什么?谢谢!

2 个答案:

答案 0 :(得分:1)

这样做有两种方法:

my $pat = join '|', map quotemeta, @codes;
my $re = qr/,(?:$pat),/;

for my $info (...) {
   my $padded_info = ",$info,";
   my $count; ++$count while $padded_info =~ /$re/g;
   ...
}

my %codes = map { $_ => 1 } @codes;

for my $info (...) {
   my $count = grep $codes{$_}, split /,/, $info;
   ...
}

我列出了代码,好像在@codes中检查了多个字符串代码。重用计算值来自实际节省的地方。

我会将基准测试和微优化留给您,因为这将取决于您的数据和使用模式。

答案 1 :(得分:0)

性能可能不是很好,取决于源字符串的大小,但如果需要,您可以稍后进行优化。

my %results;

for my $code (@codes) {
    my $count = () = $info =~ /$code/g;
    $results{$code} = $count;
}