Knuth-Morris-Prattアルゴリズムは、ある文字列を別の文字列の中に見つけるための優れた方法です (私は DNA を見たので、これを数十億にスケーリングしたいと思いますか?)。
# Knuth-Morris-Pratt string matching
# David Eppstein, UC Irvine, 1 Mar 2002
from __future__ import generators
def KnuthMorrisPratt(text, pattern):
'''Yields all starting positions of copies of the pattern in the text.
Calling conventions are similar to string.find, but its arguments can be
lists or iterators, not just strings, it returns all matches, not just
the first one, and it does not need the whole text in memory at once.
Whenever it yields, it will have read the text exactly up to and including
the match that caused the yield.'''
# allow indexing into pattern and protect against change during yield
pattern = list(pattern)
# build table of shift amounts
shifts = [1] * (len(pattern) + 1)
shift = 1
for pos in range(len(pattern)):
while shift <= pos and pattern[pos] != pattern[pos-shift]:
shift += shifts[pos-shift]
shifts[pos+1] = shift
# do the actual search
startPos = 0
matchLen = 0
for c in text:
while matchLen == len(pattern) or \
matchLen >= 0 and pattern[matchLen] != c:
startPos += shifts[matchLen]
matchLen -= shifts[matchLen]
matchLen += 1
if matchLen == len(pattern):
yield startPos
KMP pythonコード(およびランタイム定数のために小さな問題の場合は高速になるビルトイン)を入手したリンク。
最先端のパフォーマンスを得るには、文字列のプレフィックス テーブルとハッシュ ウィンドウを基数 4 の整数として使用します (生物学では、それらを k-mer またはオリゴと呼びます)。; )
幸運を!
編集:最初の文字列にすべてのプレフィックス (合計 n 個) と 2 番目の文字列にすべてのプレフィックス (合計 n 個) を含むリストを並べ替えるという素晴らしいトリックもあります。それらが最大の共通サブシーケンスを共有している場合、それらはソートされたリストで隣接している必要があるため、ソートされたリストで最も近い他の文字列から要素を見つけ、完全に一致する最長のプレフィックスを取得します。: )