12-algorithm递归和动态规划-算法性能优化

241 阅读1分钟

1. 什么是动态规划

动态规划是解决多阶段决策过程最优化的一种有效的数学方法。

// 递归Recursion             存储数据(Memoization)
// 非常适合重复计算          通过存储数据避免不必要的递归步骤
// 可能导致重复工作            中间结果被存储并重复使用
//  --------------动态规划----------
// 动态规划是一种解决问题的思路、思维,而不是一种具体方法

优化前的代码

具体结果看:11-algorithm指数时间复杂度-递归斐波那契数列&指数VS平方时间复杂度

let count = 0; // 执行的次数
function fib(n) {
    count++;
    if (n === 0 || n === 1) {
        return 1;
    }
    return fib(n - 1) + fib(n - 2);
}

优化之后的代码

let count = 0; // 执行的次数
function fib(n, memo = {}) {
    let result;
    count++;
    if (memo[n]) {
        return memo[n];
    }
    if (n === 0 || n === 1) {
        result = 1;
    } else {
        result = fib(n - 1, memo) + fib(n - 2, memo);
    }

    memo[n] = result;

    return result;
}
console.log('fib(3)', fib(3)); // fib(3) 3
console.log('count', count); // 5
count = 0;

console.log('fib(4)', fib(4)); // fib(3) 5
console.log('count', count); // 7
count = 0;

console.log('fib(5)', fib(5)); // fib(3) 8
console.log('count', count); // 9
count = 0;

console.log('fib(6)', fib(6)); // fib(3) 13
console.log('count', count); // 11
count = 0;

console.log('fib(20)', fib(20)); // fib(3) 10946
console.log('count', count); // 39
count = 0;
console.log('fib(30)', fib(30)); // fib(3) 1346269
console.log('count', count); // 59
count = 0;
console.log('fib(40)', fib(40)); // fib(3) 165580141
console.log('count', count); // 79
count = 0;

// 故,时间复杂度 T = 2 * n => O(n) 线性时间复杂度