* Это краткое введение, конкретный вопрос выделен жирным шрифтом в последнем абзаце.Обратное расстояние Хэмминга
Я пытаюсь сгенерировать все строки с заданным расстоянием Хэмминга, чтобы эффективно решать задачи биоинформатики.
Идея состоит в том, что задана строка (например, «ACGTTGCATGTCGCATGATGCATGAGAGCT»), длина слова для поиска (то есть 4) и допустимые несоответствия при поиске этого слова в строке (например, 1), возвращают наиболее часто встречающиеся слова или «мутированные» слова.
Для того, чтобы быть ясно, слово длины 4 из заданной строки может быть это (между '[]'):
[ACGT]TGCATGTCGCATGATGCATGAGAGCT #ACGT
этого
A[CGTT]GCATGTCGCATGATGCATGAGAGCT #CGTT
этого
ACGTTGCATGTCGCATGATGCATGAG[AGCT] #AGCT
Что я сделал (и его очень неэффективно, и его очень медленно, когда слова должны иметь 10 символов) генерируют все возможные слова с помощью заданное расстояние:
itertools.imap(''.join, itertools.product('ATCG', repeat=wordSize))
, а затем искать и сравнивать каждое слово в данной строке, если сгенерированные слова (или его мутация) появляется в цикле:
wordFromString = givenString[i:i+wordSize]
mismatches = sum(ch1 != ch2 for ch1, ch2 in zip(wordFromString, generatedWord))
if mismatches <= d:
#count that generated word in a list for future use
#(only need the most repeated)
То, что я хочу сделать это, вместо генерировать ВСЕ возможные слова, генерировать только мутации слов, которые появляются в данной строке с заданным числом несоответствий, другими словами, с учетом расстояния Хэмминга и слова, вернуть все возможные мутированные слова с этим (или менее) расстояние, а затем использовать их для поиска в данной строке.
Надеюсь, я был чист. Спасибо.
вы бы рассчитывать перекрывается? Например, для строки «CCACCAC» и слова «CCAC» вы бы посчитали два появления или только один? так как «С» перекрывается. –
Агностический ответ с объяснением http://stackoverflow.com/a/34523345/1090562 –