【问题标题】:Coin change memoization硬币找零记忆
【发布时间】:2013-04-14 09:38:22
【问题描述】:

下面的算法是否真的使用记忆化来寻找所有可能的方式来改变一个特定的总和?

func count( n, m )
  for i from 0 to n
    for j from 0 to m
      if i equals 0
        table[i,j] = 1          
      else if j equals 0
        table [i,j] = 0
      else if S_j greater than i
        table[ i, j ] = table[ i, j - 1 ]
      else 
        table[ i, j ] = table[ i - S_j, j ] + table[ i, j - 1 ]
return table[ n, m ]

每次调用函数 count 时,它都会从头开始填充表。即使表已经针对某些值进行了初始化,下次调用 count 时,它也不会使用这些值,而是从 i = 0 和 j = 0 重新开始。

【问题讨论】:

    标签: algorithm dynamic memoization


    【解决方案1】:

    这不是记忆。这是动态编程代码的示例。

    为了分析你的代码,首先我们需要区分记忆和动态编程。

    记忆化是一种自上而下的方法,而动态编程是一种自下而上的方法。

    考虑求一个数n的阶乘问题。

    如果你正在寻找 n!通过使用以下事实,

    n! = n * (n-1)! and 0!=1
    

    这是自上而下方法的示例。

    n 的值一直保存在内存中,直到值为 0!到(n-1)!被退回。缺点是浪费了大量的堆栈内存。优点是如果子问题已经解决,您不必重新计算子问题。子问题的解决方案存储在内存中。

    但在您的问题中,您没有自上而下的方法,因此没有记忆。

    表格中的每个条目都是直接从先前计算的子问题解决方案中获得的。它使用自下而上的方法。因此,您有一段使用动态编程的代码。

    【讨论】:

    • 谢谢,正如我所怀疑的那样。我发现这个算法的那篇文章声称它使用了momoization。
    猜你喜欢
    • 2015-07-03
    • 2014-01-11
    • 2018-06-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2012-08-05
    • 1970-01-01
    • 2020-12-16
    相关资源
    最近更新 更多