LCS实施速度优化

时间:2019-03-10 14:14:47

标签: python-3.x performance optimization lcs

我正在通过练习来学习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])

0 个答案:

没有答案