Memoisering är en avgörande optimeringsteknik som används i dynamisk programmering för att förbättra effektiviteten avsevärt. Det fungerar genom att lagra resultaten från dyra funktionssamtal och returnera det cachade resultatet när samma ingångar inträffar igen. Detta undviker redundanta beräkningar, vilket leder till en dramatisk hastighet, särskilt för problem med överlappande delproblem.
Så här används det:
1. Identifiera överlappande delproblem: Dynamisk programmering löser problem genom att dela upp dem i mindre, överlappande delproblem. Om samma delproblem stöter på flera gånger kan memoisering förhindra omberäkning.
2. lagringsresultat: En datastruktur, vanligtvis en hashtabell (ordbok i Python) eller en matris, används för att lagra resultaten från delproblem. Inmatningen till delproblemet (t.ex. parametrarna för en rekursiv funktion) fungerar som nyckeln, och det beräknade resultatet är värdet.
3. Kontrollera för cachade resultat: Innan du beräknar lösningen till ett delproblem kontrollerar algoritmen lagringen för att se om resultatet redan är tillgängligt. Om det är, returneras det cachade resultatet omedelbart.
4. lagring och återvändande resultat: Om resultatet inte är cachat, beräknar algoritmen den, lagrar den i datastrukturen och returnerar sedan den.
Exempel (Fibonacci -sekvens):
En naiv rekursiv lösning för Fibonacci -sekvensen är mycket ineffektiv på grund av upprepade beräkningar. Memoisering förbättrar drastiskt detta:
naiv (ineffektiv) rekursiv lösning:
`` `python
def fibonacci_naive (n):
Om n <=1:
returnera n
Return Fibonacci_naive (N-1) + Fibonacci_naive (N-2)
`` `
Memoiserad rekursiv lösning:
`` `python
memo ={} # ordbok för memoisering
def fibonacci_memo (n):
Om n i memo:
returnera memo [n]
Om n <=1:
resultat =n
annan:
resultat =Fibonacci_memo (n-1) + Fibonacci_memo (n-2)
memo [n] =resultat
avkastningsresultat
`` `
I den memoiserade versionen:
* `Memo` -butiker tidigare beräknade Fibonacci -nummer.
* Innan du ringer ett rekursivt samtal kontrollerar `fibonacci_memo` om resultatet för` n 'redan finns i' memo '.
* Om det är, returneras det lagrade värdet direkt. Annars beräknas resultatet, lagras i "memo" och returneras sedan.
Denna förändring förvandlar en exponentiell tidsalgoritm till en linjär tidsalgoritm. Nyckeln är att undvika redundanta beräkningar av samma Fibonacci -nummer flera gånger.
i huvudsak: Memoisering förvandlar en top-down (rekursiv) dynamisk programmeringsmetod till en mer effektiv genom genom att cacha mellanliggande resultat. Den kompletterar tabell (bottom-up) metoder, som också undviker redundanta beräkningar men använder iterativa metoder istället för rekursion. Valet mellan memoisering och tabulering beror ofta på det specifika problemet och programmerarens preferens; Båda uppnår samma mål att undvika redundanta beräkningar.