使用python在两个字符串中搜索相似单词(具有指定长度)的有效方法

使用python在两个字符串中搜索相似单词(具有指定长度)的有效方法,python,algorithm,bioinformatics,Python,Algorithm,Bioinformatics,我的输入是两个长度相同的字符串和一个数字,该数字表示我需要在这两个字符串中查找的常用词的长度。我写了一个非常简单的代码来实现这一点,它是有效的,但是考虑到每个字符串大约有20万个字母,它的速度非常慢 这是我的代码: for i in range(len(X)): for j in range(len(Y)): if(X[i] == Y[j]): for k in range (kmer):

我的输入是两个长度相同的字符串和一个数字,该数字表示我需要在这两个字符串中查找的常用词的长度。我写了一个非常简单的代码来实现这一点,它是有效的,但是考虑到每个字符串大约有20万个字母,它的速度非常慢

这是我的代码:

for i in range(len(X)):
    for j in range(len(Y)):
        if(X[i] == Y[j]):
            for k in range (kmer):                
                if (X[i+k] == Y[j+k]):
                    count +=1
                else:
                    count=0
                if(count == int(kmer)):
                    loc=(i,j)
                    pos.append(loc)
                    count=0    

        if(Xcmp[i] == Y[j]):
            for k in range (kmer):                
                if (Xcmp[i+k] == Y[j+k]):
                    count +=1
                else:
                    count=0
                if(count == int(kmer)):
                    loc=(i,j)
                    pos.append(loc)
                    count=0

return pos 
其中第一个序列是X,第二个是Y,kmer是常用词的长度。(当我说单词的时候,我指的是人物……)

我能够创建一个X乘kmer矩阵(而不是巨大的X乘Y),但这仍然非常缓慢

我也考虑过使用trie,但我认为可能需要很长时间来填充它

最后,我只需要这些公共子序列的位置

关于如何改进我的算法有什么想法吗?
谢谢!!:)

三重嵌套for循环的运行时为n^3,因为您实际上要遍历每个条目。考虑使用。它具有线性平均运行时间和最坏情况n^2。最好是找到子字符串,以便或多或少地了解您正在做的事情。在这种情况下,您可能更接近n^2,但在n^3上仍然相当不错。

创建一组这样的单词

words = {X[i:i+kmer] for i in range(len(X)-kmer+1)}
for i in range(len(Y)-kmer+1):
    if Y[i:i+kmer] in words:
        print Y[i:i+kmer]
只要
kmer
不太大,不会耗尽集合的内存,这是相当有效的。我想这不是因为你已经创建了一个这么大的矩阵

对于这些位置,创建一个dict,而不是Tim建议的一组

from collections import defaultdict
wordmap = defaultdict(list)
for i in range(len(X)-kmer+1):
    wordmap[X[i:i+kmer]].append(i)

for i in range(len(Y)-kmer+1):
    word = Y[i:i+kmer]
    if word in wordmap:
        print word, wordmap[word], i

trie听起来是个好主意。如果我理解正确,您可以将trie的深度限制为
kmer
谢谢!关于如何开始实现trie有什么提示吗?特别是深度有限?只需插入
X[0:kmer]
X[1:kmer+1]
。。。那么深度将永远不会超过
kmer
0,1,。。到绳子的长度?这不是仍然是低效的吗?(不确定我是否理解它是如何工作的..)kmer通常需要什么范围的值?因为OP需要匹配的位置,
单词
可能需要是一个dict,将字符串映射到字符串开始处的索引列表。