2015-10-10 2 views
0

Мне нужно просто подсчитать несоответствие между двумя строками. Пусть говорят:perl count несоответствие между двумя строками

my $s1 = "ATCG"; 
my $s2 = "ATTG"; 

Это должно указывать: 1 как несоответствие. Не нужно искать позицию или какие несоответствия.

Я искал быстрый способ сделать. Я думал, что расщепление на массивы и совпадение в цикле или использование substr для соответствия каждой позиции могут быть медленными, потому что их нужно проверять более чем на миллиард пар. Спасибо

+0

Являются ли эти два входа одинаковой длины? Если нет, «ABCD» и «ACD» имеют разницу в 1 или что-то еще? Даже если да, имеют ли «ABCDEF» и «ACDEFB» разницу в 2, 5 или что-то еще? – hobbs

+0

Если вы согласны что-то немного больше http://search.cpan.org/dist/Text-Levenshtein/lib/Text/Levenshtein.pm – Sobrique

ответ

4

Просто XOR две строки вместе. Каждый символ NUL в результате представляет позицию, в которой символы одинаковы в обеих строках.

my ($s1, $s2) = qw(ATCG ATTG); 

my $count = ($s1^$s2) =~ tr/\0//c; 

print "$count\n"; # Prints "1" 

Примечание: Если вы собираетесь повторно сравнить строку, передать его и один, к которому вы сравниваете его utf8::downgrade к убеждается ^ так быстро, как это может быть.

utf8::downgrade($s1); # Change the internal format in which 
utf8::downgrade($s2); # the strings are stored to speed up $s1^$s2. 

Это бесполезно или расточительно, если любая строка содержит символы UNICODE выше U + 00FF.

+0

Приятный ответ: можете ли вы использовать использование '^' в вашем коде и как оно работает.? – mkHun

+1

XOR - побитовый оператор, который находит разницу между парами бит. Таким образом, речь идет о подсчете байтов с 1-битом или тех, которые не состоят полностью из нулевых бит. – ikegami

+0

Спасибо всем, кто сделал изменения – ikegami

Смежные вопросы