Javascript 记忆实现

问题描述 投票:0回答:2

我一直在工作中和我的伙伴们讨论这个话题。 我想知道你们这是否是实现记忆的正确方法。

function memoize(result) {
  let cache = {};

  return function() {
    if (cache[result]) {
      // returns cached result / no calculation
      return cache[result];
    }
    // calculating...
    cache[result] = result;
    return cache[result];
  };
}

function expensiveCalculation() {
  let counter = 0;
  for (let i = 0; i < 1000000; i++) {
    counter += i;
  }
  return counter;
}

console.time("FirstCalculation");
const memoizedExpensiveCalculation = memoize(expensiveCalculation());
console.timeEnd("FirstCalculation");

console.time("1_Memoized");
memoizedExpensiveCalculation();
console.timeEnd("1_Memoized");

console.time("2_Memoized");
memoizedExpensiveCalculation();
console.timeEnd("2_Memoized");

console.time("3_Memoized");
memoizedExpensiveCalculation();
console.timeEnd("3_Memoized");

时间日志显示,事实上,第一次花费的时间要多得多(这是我们所期望的),而之后的时间会更少。

javascript memoization
2个回答
1
投票

您定义的“记忆”函数在功能上是无操作的,因为您没有正确缓存任何结果。


您提供的代码

function memoize(result) {
  let cache = {};

  return function() {
    if (cache[result]) {
      // returns cached result / no calculation
      return cache[result];
    }
    // calculating...
    cache[result] = result;
    return cache[result];
  };
}

基本上如下:

function memoize(result) {
  return result
}

当你记忆一个函数时,你需要缓存输入/输出对,并在输入匹配时跳过真正的函数调用。

请参阅@Nir O 的answer,了解通用记忆功能的正确实现示例。 在他们的示例中需要注意的关键点是:a)记忆函数如何接受参数,b)根据缓存检查该参数,以及 c)如果在缓存中找不到该参数,则运行昂贵的函数及其结果存储在缓存中,键是输入的参数,从而允许在后续查询中跳过计算。


0
投票

类似:

function get(func) {
  let cache = {};

  return function(key) {
    if (key in cache) {
      return cache[key];
    }
    cache[key] = func(key);
    return cache[key];
 };
}

function expensiveCalculation(param) {
  console.log('expensive calculation runs')
  let counter = 0;
  for (let i = 0; i < 10000; i++) {
    counter += i;
  }
  return param*2;
}
const memo = get(expensiveCalculation)
console.log('start')
console.log('first try');
console.log(memo(10));
console.log('second try');
console.log(memo(10));
© www.soinside.com 2019 - 2024. All rights reserved.