Skip to content

Commit dd1d0e4

Browse files
committed
add dynamic programming
1 parent 66eb448 commit dd1d0e4

File tree

6 files changed

+158
-1
lines changed

6 files changed

+158
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
2+
// const caching: any = new Map()
3+
// caching.set(2, 2)
4+
// caching.set(3, 3)
5+
// function fibonacciDP(n: number): number {
6+
// if (n <= 1) return 1
7+
// if (caching.has(n)) {
8+
// return caching.get(n)
9+
// } else {
10+
// const result = fibonacciDP(n - 1) + fibonacciDP(n - 2)
11+
// caching.set(n, result)
12+
// console.log("caching", caching);
13+
// return result
14+
// }
15+
// }
16+
17+
// console.log(fibonacciDP(8));
18+
19+
const cachingNumber: any = new Map()
20+
cachingNumber.set(2, 2)
21+
cachingNumber.set(3, 3)
22+
//0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...
23+
let calculations = 0;
24+
25+
function climbStairs(n: number): number {
26+
if (n <= 1) return 1
27+
if (n <= 3) return n
28+
// Khá giống với tìm số fiboncci
29+
let i = 3;
30+
let sum = cachingNumber.get(i - 1) + cachingNumber.get(i - 2);
31+
while (i < n) {
32+
sum = cachingNumber.get(i) + cachingNumber.get(i - 1);
33+
cachingNumber.set(i + 1, sum)
34+
i++
35+
}
36+
return sum;
37+
// O(n): Time complexity
38+
// O(n): Space complexity
39+
};
40+
41+
console.log("climbStairs", climbStairs(6));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
2+
3+
function addTo80(n: number) {
4+
console.log('take very long time');
5+
return n + 80
6+
}
7+
8+
// Chuyện gì sẽ xảy ra nếu n cùng một giá trị nhưng gọi nhiều lần ?
9+
// Có kỹ thuật nào tối ưu hơn không ?
10+
11+
const cache: { [key: number]: number } = {};
12+
function memoizedAddTo80(n: number) {
13+
if (cache[n]) {
14+
return cache[n]
15+
} else {
16+
cache[n] = 80 + n
17+
}
18+
}
19+
20+
console.log("memoizedAddTo80(5)", memoizedAddTo80(5));
21+
console.log("memoizedAddTo80(5)", memoizedAddTo80(5));
22+
23+
function closure() {
24+
debugger
25+
const cache: any = {}
26+
// Using closure to memorized things in JS!
27+
return function (n: number) {
28+
if (cache[n]) {
29+
return cache[n]
30+
} else {
31+
console.log("take a long time!");
32+
cache[n] = 80 + n
33+
}
34+
}
35+
}
36+
37+
const memoized = closure()
38+
console.log(memoized(5));
39+
console.log(memoized(5));
40+
console.log(memoized(6));
41+
console.log(memoized(7));
42+
console.log(memoized(6));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
2+
let calculations = 0
3+
function fibonacci(n: number): number {
4+
calculations++
5+
if (n <= 2) return 1
6+
return fibonacci(n - 1) + fibonacci(n - 2)
7+
}
8+
9+
// console.log(fibonacci(10))
10+
// console.log("calculation", calculations);
11+
12+
// Việc tính như vậy khá lâu, và không tối ưu (Caching)
13+
function dp() {
14+
const caching: any = new Map()
15+
caching.set(0, 0)
16+
caching.set(1, 1)
17+
return function fibonacciDP(number: number): number {
18+
calculations++
19+
if (caching.has(number)) {
20+
return caching.get(number)
21+
} else {
22+
const result = fibonacciDP(number - 1) + fibonacciDP(number - 2)
23+
caching.set(number, result)
24+
console.log("caching!", caching);
25+
return result
26+
}
27+
}
28+
}
29+
30+
const fib = dp()
31+
console.log("slow", fibonacci(20)); // 13529 lần gọi function => Tốn rất nhiều bộ nhớ khi sử dụng recursive function! => Rất dễ gây nghẽn (exceed bộ nhớ!)
32+
console.log("fast", fib(20)); // 39 lần gọi function => Super fast
33+
34+
// Performance testing
35+
// console.time("fib(20) - First Call");
36+
// console.log("fib(20)", fib(20));
37+
// console.timeEnd("fib(20) - First Call");
38+
39+
// console.time("fib(20) - Second Call");
40+
// console.log("fib(20)", fib(20));
41+
// console.timeEnd("fib(20) - Second Call");
42+
43+
// console.time("fib(19)");
44+
// console.log("fib(19)", fib(19));
45+
// console.timeEnd("fib(19)");
46+
47+
// console.time("fib(21)");
48+
// console.log("fib(21)", fib(21));
49+
// console.timeEnd("fib(21)");
50+
51+
// console.time("fib(21)");
52+
// console.log("fib(21)", fib(21));
53+
// console.timeEnd("fib(21)");
54+
55+
// console.time("fib(30)");
56+
// console.log("fib(30)", fib(30));
57+
// console.timeEnd("fib(30)");
58+
59+
// console.time("fib(30)");
60+
// console.log("fib(30)", fib(30));
61+
// console.timeEnd("fib(30)");
62+
63+
console.log("calculations", calculations);

src/algorithm/recursion/recursion-fibonacci.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ export function fibonacciIterative(n: number) {
2222
i++ // 3, 4, 5, 6, 7
2323
}
2424
return sum
25-
25+
// O(n): Time complexity
26+
// O(1): Space complexity
2627
}
2728

2829
console.log('fibonacciIterative(6)', fibonacciIterative(100));
+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
function linearSearch(array: number[], target: number): number {
3+
for (let i = 0; i < array.length; i++) {
4+
if (array[i] === target) {
5+
return i
6+
}
7+
}
8+
return -1
9+
}

0 commit comments

Comments
 (0)