在memoizition中使用数组和对象作为缓存有什么不同?

时间:2015-05-20 05:12:29

标签: javascript memoization

Fibonacci序列传统上用于解释树递归。

function fibonacci(n) {
   if(n==0 || n == 1)
       return n;
   return fibonacci(n-1) + fibonacci(n-2);}

我想实现memoization解决方案。这是我的代码:

  var fibonacci = (function(){
  var cache = [];
  return function(n){
    if(n==0 || n == 1){
      return n;
    }else{
      cache[n-1] = cache[n-1]||fibonacci(n-1);
      cache[n-2] = cache[n-2]||fibonacci(n-2);
      return cache[n-1]+cache[n-2];
    }
  }
})();

但这是另一个被许多人投票选为最佳实践的答案:

var fibonacci = (function () {
  var cache = {};

  return function(n) {

    // Base case
    if(n==0 || n == 1)
        return n;

    // Recurse only if necessary
    if(cache[n-2] === undefined)
      cache[n-2] = fibonacci(n-2);
    if(cache[n-1] === undefined)
      cache[n-1] = fibonacci(n-1);

    return cache[n-1] + cache[n-2];
  };
})(); 

我想知道在memoizition中使用数组和对象作为缓存有什么不同?

1 个答案:

答案 0 :(得分:0)

数组和对象之间始终存在相同的差异。

假设数组针对整数属性进行了优化,而对象在各种属性名称上做得更好,特别是稀疏属性。对于您的应用,斐波纳契序列,阵列确实更适合。