Rekurze: Porovnání verzí

Smazaný obsah Přidaný obsah
→‎Fibonacciho posloupnost: stovnani s tabelaci
Řádek 253:
[[Tabelace]] je způsob odstraňování neefektivity pocházející z opakovaných volání se stejnými argumenty. Spočítané výsledky se ukládají (např. do [[Pole (datová struktura)|pole]]) a místo opakovaného volání se použije výsledek z tabulky, do které se zaznamená po prvním výpočtu s danými argumenty. Položky tabulky potřebují kromě uložené hodnoty 1 bit navíc, který určuje, zda jsou data platná, tj. už spočítána. Tabelace se často používá v [[dynamické programování|dynamickém programování]]. Tento přístup je [[trade-off]] času a paměti.
 
Pole může být vícerozměrné, kdy počet rozměrů odpovídá počtu argumentů. Anebo jednorozměrné, použité jako hašovací tabulka. První reprezentace je výhodná, pokud jsou počítané hodnoty husté, druhá je spíše pro řídké.
Výhoda je, že nemusíme měnit rekurzivní algoritmus. Nevýhoda je potřeba paměti pro tabulku, která je případně větší než při "ručním" návrhu a počítání zdola. V případě Fibonacciho čísel přímočaře použijeme pole P[] velikosti N, kdežto při ručním návrhu stačí pamatovat si poslední dvě čísla.
 
Výhoda tabelace je, že nemusíme měnit rekurzivní algoritmus. Nevýhoda je potřeba paměti pro tabulku, která je případně větší než při "ručním" návrhu a počítání zdola. V případě Fibonacciho čísel přímočaře použijeme pole P[] velikosti N, kdežto při ručním návrhu stačí pamatovat si poslední dvě čísla.
Speciálně, některé úlohy dynamického programování dovolují reformulaci algoritmu šetřící paměť.
<!--Pokud je struktura výpočtu pravidelná, resp. známá anebo odvoditelná, tak je efektivnější výpočet zdola, tj. bez rekurze, když už máme pole -->
 
Tabelace nemá smysl, pokud se počítají v rekurzi různé hodnoty, příkladnapříklad jepři výpočetobvyklém výpočtu [[Rychlá Fourierova transformace|FFT]] dělíme vstupní vektor na dva různé vektory poloviční délky, kterých výsledky si explicitně pamatujeme.
 
=== Odstraňování rekurze ===