作者:MJ昊
公众号:程序猿的编程之路
今天是 昊 的算法之路第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 是输入的数量。
总结
这道题展示了如何通过简单的缓存机制来优化函数执行,特别是在处理大量重复输入时,记忆化可以显著提升性能。