无需登录 数据私有 本地保存

记忆化(Memoization)函数演示 - 缓存结果对比

11
0
0
0

记忆化(Memoization)函数演示

直观对比有缓存无缓存的执行效率差异,深入理解记忆化如何通过空间换时间优化递归计算

缓存加速 实时对比 缓存可视化
参数控制
n=1 快速 n=30 慢速 n=45
记忆化版本
等待计算
本次状态: 唯一计算: 0
无缓存版本
等待计算
递归调用: 0
缓存存储 0 条
尚未建立缓存,请先运行记忆化计算
调用日志 0 条
等待计算请求...
全局统计
0
总请求
0
缓存命中
0
缓存未命中
0%
命中率
累计加速比
缓存命中率 0%
常见问题与知识点 — 深入理解记忆化
什么是记忆化(Memoization)?

记忆化是一种优化技术,通过缓存函数调用结果来加速后续相同输入的计算。当函数被重复调用时,直接从缓存返回结果而非重新计算,以空间换时间。与广义缓存不同,记忆化通常指函数级别的结果缓存,且缓存键由函数参数自动生成。

记忆化与动态规划的关系?

记忆化本质上是自顶向下的动态规划实现方式。动态规划通常用自底向上的迭代填表法,而记忆化用递归+缓存实现相同效果。两者都能将斐波那契计算从O(2ⁿ)优化到O(n)。记忆化更直观,动态规划迭代版本更节省栈空间。

什么场景适合使用记忆化?

适合纯函数(相同输入始终产生相同输出)、计算昂贵的函数、重复调用频率高的场景。典型应用:递归算法优化、API响应缓存(短时内)、复杂数学计算、数据格式转换、React的useMemo/useCallback、Vue的计算属性等。

记忆化有什么缺点和风险?

内存消耗:缓存会占用内存,需设置缓存上限或过期策略(如LRU淘汰);②不适用非纯函数:有副作用或依赖外部状态的函数不能记忆化;③缓存失效:当底层数据变化时需手动清除;④过度优化:对简单快速函数使用记忆化可能反而增加开销。

JavaScript中如何实现记忆化?

通用模式:创建高阶函数,内部使用Map或普通对象存储缓存。键通常由JSON.stringify(args)生成。也可使用闭包保存缓存。对于递归函数,需确保递归调用的是记忆化版本自身。现代框架如React提供useMemomemo等内置记忆化API。

记忆化 vs 缓存(Cache)有什么区别?

记忆化是缓存的一种特殊形式。广义缓存可存储任意数据、有过期时间、可跨请求共享。记忆化特指函数返回值的缓存,缓存键自动由参数生成,通常存在于函数作用域内。记忆化更细粒度,对开发者更透明,而缓存更通用、更灵活。

// 通用记忆化高阶函数
function memoize(fn) {
    const cache = new Map();
    const memoized = function(...args) {
        const key = JSON.stringify(args);
        if (cache.has(key)) {
            return cache.get(key);  // 缓存命中 🎯
        }
        const result = fn.apply(this, args);
        cache.set(key, result);         // 存入缓存
        return result;
    };
    memoized.cache = cache;
    return memoized;
}