logo

Co je zapamatování? Kompletní návod

Termín Pamatování pochází z latinského slova memorandum ( pamatovat si ), což se v americké angličtině běžně zkracuje na memo a znamená transformovat výsledky funkce na něco, co si zapamatujete.

Ve výpočetní technice se memoizace používá k urychlení počítačových programů tím, že eliminuje opakované počítání výsledků a zabraňuje opakovaným voláním funkcí, které zpracovávají stejný vstup.



Co je zapamatování

Co je zapamatování

Obsah



Proč se používá Memoization?

Memoizace je specifická forma ukládání do mezipaměti která se používá v dynamické programování . Účelem ukládání do mezipaměti je zlepšit výkon našich programů a zachovat přístupnost dat, která lze později použít. V podstatě ukládá dříve vypočítaný výsledek dílčího problému a používá uložený výsledek pro stejný dílčí problém. To odstraňuje další úsilí při počítání znovu a znovu pro stejný problém. A už víme, že pokud se stejný problém objeví znovu a znovu, pak je tento problém rekurzivní povahy.

Kde použít Memoization?

Můžeme použít techniku ​​zapamatování, kde použití dříve vypočítaných výsledků přichází do obrazu. Tento druh problému se většinou používá v kontextu rekurze , zejména s problémy, které zahrnují překrývající se dílčí problémy .

Vezměme si příklad, kdy se stejný dílčí problém opakuje znovu a znovu.



Příklad, který ukazuje, kde použít zapamatování:

  Let us try to     find the factorial of a number    .>

Níže je a rekurzivní metoda pro nalezení faktoriálu čísla:

int faktoriál (bez znaménka int n)
{
if (n == 0)
návrat 1;
návrat n * faktoriál(n – 1);
}

Co se stane, když použijeme tuto rekurzivní metodu?

Pokud napíšete úplný kód pro výše uvedený úryvek, všimnete si, že v kódu budou 2 metody:

1. factorial(n) 2. main()>

Nyní, pokud máme více dotazů na nalezení faktoriálu, například hledání faktoriálu 2, 3, 9 a 5, budeme muset metodu factorial() zavolat 4krát:

factorial(2) factorial(3) factorial(9) factorial(5)>
Rekurzivní metoda k nalezení faktoriálu

Rekurzivní metoda k nalezení faktoriálu

Dá se tedy s jistotou říci, že pro nalezení faktoriálu čísel K čísel bude potřebná časová složitost O(N*K)

  • NA) najít faktoriál určitého čísla a
  • ŠIPKA) k volání metody faktorial() K v různých časech.

Jak může Memoization pomoci s takovými problémy?

Pokud si všimneme ve výše uvedeném problému, při výpočtu faktoriálu 9:

tcp vs udp
  • Počítáme faktoriál 2
  • Také počítáme faktoriál 3,
  • a také počítáme faktoriál 5

Pokud tedy uložíme výsledek každého jednotlivého faktoriálu při prvním výpočtu, můžeme snadno vrátit faktoriál libovolného požadovaného čísla za pouhých O(1) čas. Tento proces je známý jako Pamatování .

Řešení pomocí memoizace (Jak memoizace funguje?):

Pokud nejprve najdeme faktoriál 9 a uložíme výsledky jednotlivých dílčích problémů, můžeme faktoriál každého vstupu snadno vytisknout v O(1).

Proto bude časová složitost hledání faktoriálových čísel pomocí memoizace NA)

  • NA) najít faktoriál největšího vstupu
  • O(1) pro tisk faktoriálu každého vstupu.

Typy zapamatování

Implementace zapamatování závisí na měnících se parametrech, které jsou zodpovědné za řešení problému. Existují různé dimenze ukládání do mezipaměti, které se používají v technice zapamatování, níže jsou některé z nich:

  • 1D zapamatování: Rekurzivní funkce, která má pouze jeden argument, jehož hodnota nebyla konstantní po každém volání funkce.
  • 2D zapamatování: Rekurzivní funkce, která má pouze dva argumenty, jejichž hodnota nebyla konstantní po každém volání funkce.
  • 3D zapamatování : Rekurzivní funkce, která má pouze tři argumenty, jejichž hodnoty nebyly konstantní po každém volání funkce.

Jak se technika memoizace používá v dynamickém programování?

Dynamické programování pomáhá efektivně řešit problémy, které mají překrývající se dílčí problémy a optimální vlastnosti podstruktury. Myšlenkou dynamického programování je rozdělit problém na menší dílčí problémy a uložit výsledek pro budoucí použití, čímž odpadá nutnost opakovaně počítat výsledek.

Existují dva přístupy, jak formulovat řešení dynamického programování:

  1. Přístup shora dolů: Tento přístup navazuje na zapamatování technika . Skládá se z rekurze a ukládání do mezipaměti . Ve výpočtech představuje rekurze proces opakovaného volání funkcí, zatímco mezipaměť odkazuje na proces ukládání mezivýsledků.
  2. Přístup zdola nahoru: Tento přístup využívá tabelování technika implementovat řešení dynamického programování. Řeší stejné problémy jako dříve, ale bez rekurze. V tomto přístupu iterace nahrazuje rekurzi. Nedochází tedy k chybě přetečení zásobníku nebo režii rekurzivních procedur.
Jak se technika memoizace používá v dynamickém programování

Jak se technika memoizace používá v dynamickém programování

Jak se Memoization liší od Tabulation?

Tabulování vs memoizace

Tabulování vs memoizace

Další podrobnosti naleznete na adrese: Tabulování vs. zapamatování

Problémy s nácvikem kódování při zapamatování

Otázka

Článek

Praxe

Video

Počítejte způsoby, jak se dostat na n’té schodiště

Pohled Řešit

Hodinky

Problém lámání slov | DP-32

Pohled Řešit Hodinky

Program pro Fibonacciho čísla

Pohled Řešit Hodinky

n-té katalánské číslo

Pohled Řešit

Hodinky

Problém zlatého dolu

Pohled Řešit

Hodinky

Problém podmnožiny součtu

Pohled Řešit

Hodinky

Řezání tyče

Pohled Řešit Hodinky

Cesta minimálních nákladů

Pohled Řešit

Hodinky

Minimální počet skoků k dosažení konce

Pohled Řešit

Hodinky

Nejdelší palindromický podřetězec | Sada 1

Pohled Řešit Hodinky

Nejdelší opakující se sekvence

Pohled Řešit Hodinky

Spočítejte způsoby, jak dosáhnout n-tého schodiště pomocí kroku 1, 2 nebo 3

Pohled Řešit Hodinky

Spočítejte různé způsoby, jak vyjádřit N jako součet 1, 3 a 4

Pohled Řešit Hodinky

Spočítejte počet způsobů, jak překonat vzdálenost

Pohled Řešit Hodinky

Počet polí s po sobě jdoucím prvkem s různými hodnotami

Pohled Řešit

Hodinky

Souvislé dílčí pole s největším součtem

Pohled Řešit Hodinky

Souvislé podpole s nejmenším součtem

Pohled Řešit

Hodinky

Jedinečné cesty v mřížce s překážkami

Pohled Řešit Hodinky

Různé způsoby, jak sečíst n pomocí čísel větších nebo rovných m

Pohled Řešit

Hodinky

Často kladené otázky (FAQ) o Memoization

1: Je zapamatování lepší než DP?

Memoizace je přístup shora dolů k řešení problému s dynamickým programováním. Říká se tomu memoizace, protože vytvoříme poznámku pro hodnoty vrácené z řešení každého problému.

2: Je zapamatování totéž jako ukládání do mezipaměti?

Memoizace je ve skutečnosti specifický typ ukládání do mezipaměti. Termín ukládání do mezipaměti může obecně odkazovat na jakoukoli techniku ​​ukládání (jako je ukládání do mezipaměti HTTP) pro budoucí použití, ale ukládání do mezipaměti konkrétněji odkazuje na funkci ukládání do mezipaměti, která vrací hodnotu.

3: Proč je ukládání do paměti shora dolů?

Přístup shora dolů rozděluje velký problém na několik dílčích problémů. pokud je dílčí problém již vyřešen, použijte odpověď znovu. V opačném případě vyřešte dílčí problém a uložte výsledek do nějaké paměti.

4: Používá zapamatování rekurzi?

Memoizace se řídí přístupem shora dolů k řešení problému. Skládá se z rekurze a ukládání do mezipaměti. Ve výpočtech představuje rekurze proces opakovaného volání funkcí, zatímco mezipaměť odkazuje na proces ukládání mezivýsledků.

5: Mám používat tabelaci nebo memoizaci?

U problémů vyžadujících vyřešení všech dílčích problémů tabelování obvykle překonává memoizaci konstantním faktorem. Je to proto, že tabelování nemá žádnou režii rekurze, což zkracuje dobu pro vyřešení zásobníku volání rekurze z paměti zásobníku.
Kdykoli je třeba vyřešit dílčí problém pro vyřešení původního problému, je vhodnější zapamatovat si, protože dílčí problém se řeší líně, tj. provádějí se pouze požadované výpočty.

6: Kde se používá zapamatování?

Memoizace je optimalizační technika používaná k urychlení počítačových programů ukládáním výsledků drahých funkcí do mezipaměti a jejich vracením, když jsou znovu nalezeny stejné vstupy.

7: Proč se tomu říká memoizace?

Termín memoizace pochází z latinského slova memorandum (pamatovat si), které se v americké angličtině běžně zkracuje na memo a znamená transformovat výsledky funkce na něco, co si zapamatujete.

8: Jak memoizace snižuje časovou složitost?

Řešení stejného problému znovu a znovu vyžaduje čas a zvyšuje komplexnost běhu celého programu. Tento problém lze vyřešit udržováním nějaké mezipaměti nebo paměti, kam uložíme již vypočítaný výsledek problému pro určitý konkrétní vstup. Pokud tedy nechceme přepočítávat stejný problém, můžeme jednoduše použít výsledek uložený v paměti a snížit časovou složitost.

9: Jaký je rozdíl mezi ukládáním do paměti a ukládáním do mezipaměti?

Memoizace je ve skutečnosti specifický typ ukládání do mezipaměti, který zahrnuje ukládání návratové hodnoty funkce do mezipaměti na základě vstupu. Ukládání do mezipaměti je obecnější pojem. Například ukládání do mezipaměti HTTP je ukládání do mezipaměti, ale není to ukládání do paměti.

10: Proč je tabelování rychlejší než zapamatování?

Tabulování je obvykle rychlejší než zapamatování, protože je iterativní a řešení dílčích problémů nevyžaduje žádnou režii rekurzivních volání.

Memoizace je technika používaná v informatice k urychlení provádění rekurzivních nebo výpočetně nákladných funkcí ukládáním výsledků volání funkcí do mezipaměti a vrácením výsledků uložených v mezipaměti, když se znovu objeví stejné vstupy.

Základní myšlenkou memoizace je uložit výstup funkce pro danou sadu vstupů a vrátit výsledek uložený v mezipaměti, pokud je funkce volána znovu se stejnými vstupy. Tato technika může ušetřit čas výpočtu, zejména u funkcí, které jsou volány často nebo mají vysokou časovou složitost.

Zde je podrobný průvodce implementací zapamatování:

Pomocí zapamatování určete funkci, kterou chcete optimalizovat. Tato funkce by měla mít opakované a drahé výpočty pro stejný vstup.

Vytvořte objekt slovníku, do kterého budou uloženy výsledky funkce uložené v mezipaměti. Klíče slovníku by měly být vstupními parametry funkce a hodnoty by měly být vypočtenými výsledky.

Na začátku funkce zkontrolujte, zda jsou vstupní parametry již přítomny ve slovníku mezipaměti. Pokud ano, vraťte výsledek uložený v mezipaměti.

Pokud vstupní parametry nejsou ve slovníku mezipaměti, vypočítejte výsledek a uložte jej do slovníku mezipaměti se vstupními parametry jako klíčem.

Vraťte vypočítaný výsledek.

Zde je příklad kódu Python implementace memoizace pomocí slovníku:

Python3




def> fibonacci(n, cache>=>{}):> >if> n>in> cache:> >return> cache[n]> >if> n>=>=> 0>:> >result>=> 0> >elif> n>=>=> 1>:> >result>=> 1> >else>:> >result>=> fibonacci(n>->1>)>+> fibonacci(n>->2>)> >cache[n]>=> result> >return> result>

sdlc

>

>

Výstup

>

Ve výše uvedeném kódu definujeme funkci zvanou Fibonacci, která vypočítá n-té číslo ve Fibonacciho posloupnosti. K ukládání výsledků volání funkcí používáme objekt slovníku nazvaný cache. Pokud je vstupní parametr n již ve slovníku mezipaměti přítomen, vrátíme výsledek uložený v mezipaměti. V opačném případě vypočítáme výsledek pomocí rekurzivních volání Fibonacciho funkce a uložíme jej do cache slovníku, než jej vrátíme.

Memoization lze použít k optimalizaci výkonu mnoha funkcí, které mají opakované a nákladné výpočty. Ukládáním výsledků volání funkcí do mezipaměti se můžeme vyhnout zbytečným výpočtům a urychlit provádění funkce.

Závěr

Memoizace je koncept programování a lze jej aplikovat na jakýkoli programovací jazyk. Jeho absolutním cílem je optimalizace programu. Obvykle se tento problém vyskytuje, když programy provádějí náročné výpočty. Tato technika ukládá do mezipaměti všechny předchozí výsledky, které jsou vypočteny, takže nebude muset přepočítávat pro stejný problém.

Související články:

  • Memoizace pomocí dekorátorů v Pythonu
  • Zapamatování JavaScriptu