在最长公共子序列的递归解中的memoization的优点

时间:2012-09-27 20:17:25

标签: algorithm recursion dynamic-programming memoization

我正在阅读一篇关于在geekforgeeks解决Longest Common Subsequence问题的文章,其中有两个解决方案,一个是递归的,另一个是通过二维数组通过DP。 DP解决方案在O(NM)时间执行此操作,而递归操作在O(2^N)时间执行。

递归解决方案的主要问题是子序列重叠的发生,如此处所示。但是,如果我将每个对存储在一个散列中,那么下次该函数的递归需要该值时,它可以直接从散列中获取值而不是进一步递归。那么这个增加多少会提高效率呢?它会来O(NM)吗?

其次,递归解决方案如何产生O(2^N)时间?如何找出像这样的递归函数的复杂性,或者找到斐波那契序列等的复杂函数?

1 个答案:

答案 0 :(得分:4)

是的,使用哈希会使其成为O(NM)。在这种情况下,该过程称为memoization(是的,没有r)。只要确保你没有使用你选择的语言提供的实际hashmap容器,使它成为一个简单的矩阵:如果当前对的值是-1,则递归计算它,否则假设它已经被计算并将其归还。

关于你的第二个问题,你可以通过数学方法做到最好的约束,或者像你的链接一样在纸上画出来“足够好”:

                f(n)
               /    \
         f(n-1)      f(n-2)
        /     \        
  f(n-2)       f(n-3)
          ...

这应足以归纳地建议它为O(2^n):树的高度为n,并且在每个节点上,您有两个递归调用,可以减少大小{{1大小n(将为n - 1)。因此O(2^(n - 1)原始问题的大小为n

请注意,说斐波那契是O(2^n)并不是错误的,但你可以与其他数学方法更紧密地结合。