我正在通过练习来学习Python,然后在各个方向上“推动”,例如优化执行时间。因此,我为LCS算法编写了此代码,即搜索存在于大小相等的两个不同字符串s1和s2中的最长字符集。
我使用了众所周知的算法,但是字符串长于例如1,000,代码永无止境,因为它构建了1,000 x 1,000的矩阵。
因此,首先我减少了lcs矩阵的行数,因为我们实际上只需要最后一行+ 1行即可工作,并在每次迭代时都删除了第一行。 速度提高了很多,但我仍然无法达到5,000。
然后我有了重新使用第一行而不是抛弃它的想法,我又有了很大的改进,最终可以做很长的字符串:5,000个字符的26s。
但是我想一直走下去,所以我尝试用a> b替换max(a,b),然后... else ...,我获得了20%的收益。 对我来说,这非常令人惊叹。
因此,如果您看一下代码,是否有办法获得甚至更多我没看到的东西?
您是否认为仅为此目的而用C编写库可以有所收获?我知道这只是一种锻炼,但对我来说,这也是学习的好方法。
代码如下:
len_s = len(s1)
lcs = [[0] * (len_s + 1)] + [[0] * (len_s + 1)]
m_1 = 0
for i in range(0,len_s):
m_1 = 1 - m_1
for j in range(0, len_s):
if s1[j] == s2[i]:
lcs[m_1][j+1] = lcs[1 - m_1][j] + 1
#else: lcs[m_1][j+1] = max(lcs[m_1][j], lcs[m_0][j+1])
elif lcs[m_1][j] > lcs[1 - m_1][j+1]:
lcs[m_1][j+1] = lcs[m_1][j]
else:
lcs[m_1][j+1] = lcs[1 - m_1][j+1]
print(lcs[m_1][len_s])