使用python在两个字符串中搜索相似单词(具有指定长度)的有效方法
我的输入是两个长度相同的字符串和一个数字,该数字表示我需要在这两个字符串中查找的常用词的长度。我写了一个非常简单的代码来实现这一点,它是有效的,但是考虑到每个字符串大约有20万个字母,它的速度非常慢 这是我的代码:使用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):
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,将字符串映射到字符串开始处的索引列表。