基于重复子问题剪枝与哈希/数组映射缓存,彻底解决指数级递归的“状态爆炸”
在深度优先搜索 (DFS) 和递归中,很多状态会被多次重复计算。例如在计算斐波那契数 $F(5)$ 时,我们必须计算 $F(4)$ 和 $F(3)$;而在计算 $F(4)$ 时,又要计算一次 $F(3)$。这使得朴素递归的时间复杂度达到了恐怖的指数级 $O(2^N)$。
记忆化搜索通过引入一个全局缓存容器(通常是数组或哈希表)来记录已经求解过的状态。在每次进入递归函数时,首先查表:
通过这种自顶向下的“空间换时间”优化,可将时间复杂度骤降为线性 $O(N)$!
// 1. 记忆化搜索:查表与写入缓存
int memo[6] = {-1, -1, -1, -1, -1, -1};
int fib(int n) {
if (n <= 1) return n;
if (memo[n] != -1) {
return memo[n]; // 缓存命中!
}
memo[n] = fib(n - 1) + fib(n - 2); // 写入缓存
return memo[n];
}