【发布时间】:2017-02-22 16:58:26
【问题描述】:
我正在尝试通过已完成的 DP 表进行回溯。假设表格正确填写了正确的值。如果愿意,我可以发布表格的 sn-p。 但这是我的代码的 sn-p,它从回溯生成字符串
def stringBuilder(array, xLine, yLine):
StringA, StringB = "", ""
i, j = len(xLine), len(yLine)
minCost = array[i][j]
while (i != 0 and j != 0):
minCost = min(array[i - 1][j], array[i][j - 1], array[i - 1][j- 1])
if (minCost == array[i - 1][j - 1]):
StringA += xLine[i - 1]
StringB += yLine[j - 1]
array[i - 1][j - 1] = 0
i -= 1
j -= 1
elif (minCost == array[i][j - 1]):
StringA += '-'
StringB += yLine[j - 1]
array[i][j - 1] = 0
j -= 1
elif (minCost == array[i - 1][j]):
StringA += xLine[i - 1]
StringB += '-'
array[i - 1][j]= 0
i -= 1
我的逻辑是它总是查看表格并找到最小值,试图回到表格的 0 部分的成本。 i & j 应该是 0 并且循环退出。 NW 算法的特别之处在于,间隙、删除、交换的值可以是他们想要的任何数字,而不仅仅是 -1、0 等
根据检查回溯的脚本,我错了。虽然我知道我正在正确填写表格,因为另一个测试脚本证实了这一点。
【问题讨论】:
-
您好,问题可能是有多个相邻的正方形具有相同的
minCost?如果是这种情况,您的最终对齐方式会有所不同,具体取决于您通过 if 语句检查的顺序 -
问题仅仅是你正在反向生成字符串吗?如果是,则添加 StringA=StringA[::-1] 和 StringB=StringB[::-1]
-
再次感谢 nbryans,我摆弄了订单以及循环如何终止并自己解决。但是对于它的价值,我没有包括它,但我确实在最后翻转了字符串。我在下面发布了解决方案
标签: python algorithm dynamic-programming bioinformatics