LeetCode|2623. 记忆函数(day6)

作者:MJ昊

博客:掘金CSDN

公众号:程序猿的编程之路

今天是 昊 的算法之路第6天,今天分享的是LeetCode第2623题记忆函数的解题思路。这道题目虽然难度为中等,但通过使用缓存优化可以显著提高函数执行效率,避免重复计算。

题目描述简要回顾

记忆函数(Memoization)是一种优化技术,主要用于加速计算密集型函数的执行。其核心思想是在函数执行时将已经计算过的结果缓存起来,下次遇到相同的输入时直接从缓存中获取结果,而不需要重新计算。

在这道题中,你需要实现一个函数 memoize(fn),它返回一个记忆化版本的函数。这个记忆化函数将缓存传递给它的参数,并返回已缓存的结果,如果之前已经用相同的参数调用过 fn

解题思路

我们可以通过一个简单的缓存机制来实现记忆化。在 JavaScript 中,我们可以使用 Map 对象来存储函数输入和输出的对应关系。通过 Map,我们可以快速检查是否已经计算过相同的输入,并直接返回缓存结果。

代码实现:

function memoize(fn) {
    const cache = new Map(); // 用于存储函数输入和输出的缓存
    return function () {
        let key = arguments[0]; // 将第一个参数作为 key
        // 处理多个参数情况,可以将多个参数组合成唯一的 key
        if (arguments[1]) {
            key += arguments[1] * 100001;
        }
        const result = cache.get(key); // 检查缓存中是否已有该 key
        if (result !== undefined) {
            return result; // 如果已有缓存结果,直接返回
        }
        // 没有缓存结果,调用原始函数并将结果缓存
        const functionOutput = fn.apply(null, arguments);
        cache.set(key, functionOutput); // 缓存计算结果
        return functionOutput;
    }
}

复杂度分析

  • 时间复杂度:对于每次调用,检查和存储缓存的时间复杂度为 O(1),因此整体时间复杂度取决于未缓存时的 fn 的计算复杂度。

  • 空间复杂度:取决于缓存的数量。最坏情况下需要 O(n) 的空间来存储所有可能的输入结果对,其中 n 是输入的数量。

总结

这道题展示了如何通过简单的缓存机制来优化函数执行,特别是在处理大量重复输入时,记忆化可以显著提升性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值