Skip to content

Commit

Permalink
Update 01.Memoization.md
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Mar 6, 2023
1 parent f509d0c commit 9e19844
Showing 1 changed file with 3 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
记忆化搜索是动态规划的一种实现方式。在记忆化搜索中,当算法需要计算某个子问题的结果时,它首先检查是否已经计算过该问题。如果已经计算过,则直接返回已经存储的结果;否则,计算该问题,并将结果存储下来以备将来使用。

举个例子,比如说求解「斐波那契数列」,定义是`f(1) = 1, f(2) = 2, f(n) = f(n - 1) + f(n - 2)`对应的递推过程如下
举个例子,比如「斐波那契数列」的定义是`f(1) = 1, f(2) = 2, f(n) = f(n - 1) + f(n - 2)`如果我们使用递归算法求解第 $n$ 个斐波那契数,则对应的递推过程如下

![](http://qcdn.itcharge.cn/images/20230306140939.png)

如果使用普通递归算法,则:想要计算 `f(5)`,需要先计算 `f(4)``f(3)`,而在计算 `f(4)` 时还需要计算 `f(3)`。这样 `f(3)` 就进行了多次计算。
从图中可以看出:如果使用普通递归算法,想要计算 `f(5)`,需要先计算 `f(4)``f(3)`,而在计算 `f(4)` 时还需要计算 `f(3)`。这样 `f(3)` 就进行了多次计算。

为了避免重复计算,我们可以使用数组或哈希表结构来保存已经求解过的 `f(k)` 的结果。如上图所示,当递归调用用到 `f(k)` 时,先查看一下之前是否已经计算过结果,如果已经计算过,则直接从对应结构中取值返回,而不用再递推下去,这样就避免了重复计算问题。
为了避免重复计算,我们可以使用一个缓存(数组或哈希表)来保存已经求解过的 `f(k)` 的结果。如上图所示,当递归调用用到 `f(k)` 时,先查看一下之前是否已经计算过结果,如果已经计算过,则直接从缓存中取值返回,而不用再递推下去,这样就避免了重复计算问题。

使用「记忆化搜索」方法解决斐波那契数列的代码如下:

Expand Down

0 comments on commit 9e19844

Please sign in to comment.