DNA比对,优化递归功能

时间:2013-11-23 23:15:13

标签: python recursion bioinformatics

所以我有一个函数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) 

这不是真正的代码,只是这个想法,它有效,但对大股来说真的很慢。我需要它是递归的,所以关于如何优化它的任何想法?或者可能还有其他一些方法可以使它成为递归代码,以便它更快地运行?

1 个答案:

答案 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)的结果以避免重复计算。