python记忆化搜索——缓存@cache与@lru_cache

记忆化搜索是将已经求解出来的结果保存下来,在下次调用时不用重新计算,直接获取结果即可,通常用于递归、动态规划中。

python提供了2种不同形式的缓存装饰器:
@cache、@lru_cache

@lru_cache属于functools模块
LRU(Least Recently Used),当缓存队列已满时,将缓存使用次数最少的元素从队列中移除,将新元素加入队列。

@functools.lru_cache(maxsize=128, typed=False)
其中maxsize为最大缓存数量,默认为128。None则无限制。
typed=True时不同参数类型的调用将分别缓存,默认False

示例
恰好移动k步到达某一位置的方法数目

给你两个 正 整数 startPos 和 endPos 。最初,你站在 无限 数轴上位置 startPos 处。在一步移动中,你可以向左或者向右移动一个位置。

给你一个正整数 k ,返回从 startPos 出发、恰好 移动 k 步并到达 endPos 的 不同 方法数目。由于答案可能会很大,返回对 109 + 7 取余 的结果。

如果所执行移动的顺序不完全相同,则认为两种方法不同。

注意:数轴包含负整数。

示例 1:
输入:startPos = 1, endPos = 2, k = 3
输出:3
解释:存在 3 种从 12 且恰好移动 3 步的方法:
- 1 -> 2 -> 3 -> 2.
- 1 -> 2 -> 1 -> 2.
- 1 -> 0 -> 1 -> 2.
可以证明不存在其他方法,所以返回 3 。

示例 2:
输入:startPos = 2, endPos = 5, k = 10
输出:0
解释:不存在从 25 且恰好移动 10 步的方法。
 

提示:
1 <= startPos, endPos, k <= 1000

# 方法二:记忆化搜索
# 时间复杂度:
# 空间复杂度:
if abs(endPos - startPos) == k and k > 0:
    return 1

ans = 0
MOD = (10**9+7)
@cache
def dfs(index, step):
    #print(index, step)
    nonlocal ans
    res = 0
    if index == endPos and step == k:
        #ans += 1
        res += 1
        
    for i in [-1, 1]:
        if step + 1 <= k:
            res += dfs(index + i, step + 1)
    return res % MOD

return dfs(startPos, 0)
# 方法三:记忆化搜索
# 时间复杂度:
# 空间复杂度:
if abs(endPos - startPos) == k and k > 0:
    return 1

ans = 0
MOD = (10**9+7)
@lru_cache(None)
def dfs(index, step):
    #print(index, step)
    nonlocal ans
    res = 0
    if index == endPos and step == k:
        #ans += 1
        res += 1
        
    for i in [-1, 1]:
        if step + 1 <= k:
            res += dfs(index + i, step + 1)
    return res % MOD

return dfs(startPos, 0)

你可能感兴趣的:(缓存,算法,leetcode)