mi a Memoizáció
a Memoizáció egy optimalizálási technika, amely felgyorsítja az alkalmazásokat a drága függvényhívások eredményeinek tárolásával és a gyorsítótárazott eredmény visszaadásával, ha ugyanazokat a bemeneteket ismét megadják.
Vegyünk egy példát, ez a módszer egy szám faktoriális kiszámítására rekurzió segítségével.
function recursiveFac(n) { if (n === 0) { return 1 } else { return n * recursiveFac(n - 1) }}
ez a funkció jól működik, de hosszú távon drága lesz. tegyük fel, hogy ha először a memoFac(7) – t, majd a memoFac(8) – t hívja meg, gyorsítótár nélkül a korábban kiszámított értékek tárolásához meg kell ismételnünk az egész folyamatot, a függvényt további 7-szer visszaadva.
const cache = {}function memoFac(n) { if (cache) { return cache } else { if (n === 0) { cache = 1 } else { cache = n * memoFac(n - 1) } return cache}
tehát van egy másik funkció memoFac () és global cache objektum, amely tárolja az eredményt, hogy a kulcsot.
most, ha a memoFac(8) meghívása után meghívjuk a memofac(7) programot, akkor a faktoriális(7) számított értékét már elmentettük a “gyorsítótár” objektumunkba, amelyet a függvényen kívülre helyeztünk, hogy megtartsuk a gyorsítótárazási számításokat. Így csak egyszer kell meghívnunk a függvényt, kiszámoljuk a 8 * memoFac(7) értéket, amely egyenesen a “gyorsítótárunkba” küld minket a gyorsítótárazott érték lekérésére. Király!
de várjon-ha a memoizálás ugyanazt az Általános formátumot követi (értékek lekérése a függvény külső hatókörében lévő gyorsítótárból, vagy az érték kiszámítása az anonim bezárási függvény segítségével), nem írhatnánk általános memoize függvényt? De igen!
a memoizáció fogalma a JavaScript-ben alapvetően két fogalomra épül.
- lezárások
- magasabb rendű funkciók
function memoizerHoc(fun){ let cache = {} return function (n){ if (cache != undefined ) { return cache } else { let result = fun(n) cache = result return result } }}
itt van hoc függvény memoizerHoc () és egy helyi változó gyorsítótár, amely elérhető a visszaadott függvényen belül (Bezárás).