我写了Smith-Waterman算法,它正在泄漏
这是我泄漏的代码片段:
for row in range(1, n + 1):
for col in range(1, m + 1):
left = table[row][col - 1] - 1
up = table[row - 1][col] - 1
upLeft = table[row - 1][col - 1] + s(seq1[col - 1], seq2[row - 1])
table[row][col] = max(left, up, upLeft)
最后一行泄密。
如何只复制值而不是使用引用,或者我应该用这个内部列表引用做什么?
其他问题是如何优化此算法仅使用2列/行,但它可能并不困难。首先,我想知道代码泄漏的原因。
完整代码:
def smith_waterman(seq1, seq2):
"""
:rtype : float
:return: folat
:param seq1: list of 0,1,2
:param seq2: list of 0,1,2
"""
m = len(seq1)
n = len(seq2)
def s(a, b):
"""
:param a: 0,1,2
:param b: 0,1,2
:return: iteger
"""
c = a + b
if a == b:
return 2
elif c == 3:
return 1
elif c == 2:
return 2
else:
return -1
# create empty table
table = []
for i in range(n + 1):
table.append([])
for j in range(m + 1):
table[i].append(0)
for row in range(1, n + 1):
for col in range(1, m + 1):
left = table[row][col - 1] - 1
up = table[row - 1][col] - 1
upLeft = table[row - 1][col - 1] + s(seq1[col - 1], seq2[row - 1])
table[row][col] = max(left, up, upLeft)
return table[n][m]) / (n + m)
答案 0 :(得分:0)
“漏水”是什么意思?你指的是你的算法使用的内存比预期多吗?如果是这种情况,那么它可能与您的表定义与其用法有关:您正在分配一个n x m表,而您只使用(n-1)x(m-1)个项。
尝试将循环从range(1, n+1)
更改为range(n)
,对第二个索引进行类似的更改(当然更新索引用法)。