Najszybszy sposób na znalezienie pozycji niezgodności między dwoma łańcuchami o tej samej długości
Mam miliony par ciągów o tej samej długości, które chcę porównać i znaleźć pozycję, w której ma niedopasowania.
Na przykład dla każdego$str1
i$str2
chcemy znaleźć pozycję niezgodności z$str_source
:
$str_source = "ATTCCGGG";
$str1 = "ATTGCGGG"; # 1 mismatch with Str1 at position 3 (0-based)
$str2 = "ATACCGGC"; # 2 mismatches with source at position 2 and 7
Czy jest na to szybki sposób. Obecnie mam metodę w stylu C, która zapętla każdą pozycję w obu łańcuchach, używając funkcji substr. Ale to podejście jest strasznie powolne.
my @mism_pos;
for $i (0 .. length($str_source)) {
$source_base = substr($str_source,$i,1);
$str_base = substr($str2,$i,$1);
if ($source_base ne $str_base) {
push @mism_pos,$i;
}
}