所以我有一个函数get_best
,它可以找到2条DNA链的最佳分数。
代码摘要:
def get_best(pointer_1, dna_1, Pointer_2, dna_2):
if len(dna_1) == pointer_1 or len(dna_2) == pointer_2:
score = check_score(dna_1, dna_2)
return score dna_1, dna_2
return max(get_best(no_gaps, advance pointers),
get_best(gap in first, advance only first pointer),
get_best(gap in second, advance only second pointer)
这不是真正的代码,只是这个想法,它有效,但对大股来说真的很慢。我需要它是递归的,所以关于如何优化它的任何想法?或者可能还有其他一些方法可以使它成为递归代码,以便它更快地运行?
答案 0 :(得分:0)
问题在于有效的实现算法,它与Dynamic Time Warping算法基本相同。 与维基百科链接一样,您应该将中间结果存储在某处。您的代码一次又一次地计算相同的结果。这真的很低效。
以下是您的代码效率低下的原因。
假设我们想要计算g
递归定义的函数g(i,j) = F(g(i-1,j),g(i,j-1),g(i-1,j-1)
的值,其中F
是任何预定义的函数。
当我们在(2,2)评估时,让我们遵循代码。 代码递归地评估以下几点:
g(2,2) -> g(1,2), g(2,1), g(1,1).
然后在(1,2)处求值,调用进一步的递归:
g(1,2) -> g(0,2), g(1,1), g(0,1)
也适用于(2,1)
g(2,1) -> g(1,2), g(1,1), g(1,0)
从(1,2)和(2,1)开始的两个递归链分别评估相同的点(1,1)。因此,g(1,1)被计算不止一次。这显然效率低下。我们可以存储g(1,1)的结果以避免重复计算。