Q30. Explain the concept of memoization with an example.
একই হিসাব বারবার না করে ফল মনে রাখার কৌশল, Map দিয়ে বাস্তব উদাহরণ।
Memoization মানে কোনো ফাংশনকে দিয়ে একবার হিসাব করা হলে সেই ফলত্র মনে রাখা — পরে একই ইনপুট এলে আবার হিসাব না করে সঙ্গে সঙ্গে ফলত্র ফেরত দেওয়া।
function slowSquare(n) {
console.log("হিসাব হচ্ছে:", n);
return n * n;
}
slowSquare(4); // হিসাব হচ্ছে: 4 → 16
slowSquare(4); // আবার হিসাব হচ্ছে: 4 → 16
slowSquare(5); // হিসাব হচ্ছে: 5 → 25function memoize(fn) {
const cache = new Map();
return function (...args) {
// key হিসাব করা
const key = JSON.stringify(args);
if (cache.has(key)) {
console.log("cache থেকে:", key);
return cache.get(key);
}
console.log("নতুন করে হিসাব:", key);
const result = fn(...args);
cache.set(key, result);
return result;
};
}
const fastSquare = memoize(slowSquare);
fastSquare(4); // নতুন করে হিসাব: [4] → 16
fastSquare(4); // cache থেকে: [4] → 16
fastSquare(5); // নতুন করে হিসাব: [5] → 25ধাপে ধাপে — প্রথমবার fastSquare(4) ডাকলে cache-এ কিছু নেই, তাই আসল হিসাব হয় এবং ফল 16 cache-এ জমা হয়। দ্বিতীয়বার একই আর্গুমেন্ট এলে cache-এ ফল পাওয়া যায়, তাই আর হিসাব হয় না। 5-এর জন্য নতুন key, তাই সেটা আবার হিসাব হয়।
মূল শর্ত হলো — cache-এর key তৈরি হতে হবে ইনপুটের সব তথ্য ধরে। শুধু প্রথম আর্গুমেন্ট ধরলে বাকিগুলো বদলে গেলে ভুল ফলত্র ফিরে যাবে।
// বহু আর্গুমেন্ট থাকলে সব ধরতে হবে
const memoSum = memoize((a, b) => a + b);
memoSum(2, 3); // 5
memoSum(2, 3); // cache থেকে 5
// শুধু একটা আর্গুমেন্ট ধরলে ভুল হতো
// memoSum(4, 1) আর memoSum(4, 9) একই ফল দিতMap-এর বদলে WeakMap ব্যবহার করলে cache দীর্ঘদিন টিকে থাকে না — key object মুছে গেলে entry-ও মুছে যায়, ফলে মেমরি ফাঁকা হয় না।
Memoization শুধু ফাংশনের জন্য নয়, React-এর useMemo ও useCallback ধারণাটিও একই ধরনের পুনরায় হিসাব এড়ানো।
| বিষয় | Memoized | সাধারণ |
|---|---|---|
| একই ইনপুটে সময় | প্রথমটির সমান | নতুন করে হিসাব |
| মেমরি | বাড়ে | বাড়ে না |
| উপযুক্ত | ব্যয়বহুল, ইনপুট সীমিত | সবসময় |
Memoization শুধু তখনই লাভবান, যখন ইনপুট সীমিত থাকে — যেমন সংখ্যা বা ছোট string। ইনপুট অসীম (যেমন timestamp) হলে cache কখনো মিলে না, বরং মেমরি উপচে পড়ে।