Rekurzivní algoritmy
Editovat
Note
|
Metoda rozděl a panuj, výhody a nevýhody použití rekurze, odstranění rekurze. Vysvětlení principů a implementace řadících rekurzivních algoritmů. Vztah rekurze a matematické indukce. IB002, IB015 |
Rekurze nastává, když funkce přímo, či nepřímo ("ob jiné funkce") volá sama sebe. To samé se dá aplikovat i na struktury, které obsahují samy sebe (skrze pointer nebo ekvivalent).
Výhody rekurze
-
V některých případech čistší a elegantnější kód.
-
Důkazy korektnosti využívají známé metody matematické indukce.
-
Složitost lze zapsat pomocí rekurentní rovnice.
Nevýhody rekurze
-
Když si člověk nedá pozor, přeteče mu zásobník, což se špatně ladí.
-
Volání funkce má vyšší režii (časovou i paměťovou) než vlastní správa zásobníku.
-
Mentálně náročnější než
for
cyklus.
Odstranění rekurze
Každý rekurzivní algoritmus lze převést na iterativní. Pokud je rekurze koncová (tail
), lze ji nahradit for
cyklem.
Není-li koncová, je potřeba použít zásobník.
Rozděl a panuj
Přístup dělení na problému na menší, ale podobné podproblémy. Kombinací řešení podproblémů získáme řešení celkové. Tento přístup se často implementuje pomocí rekurze.
Rekurzivní řadící algoritmy
Mergesort
Složitost: .
-
Rozděl posloupnost na poloviny. ()
-
Rekurzivně seřaď obě poloviny. ()
-
,,Slij'' obě seřazené posloupnosti do jedné. ()
Quicksort
Složitost: průměrně ; , pokud už posloupnost seřazená je.
-
Vyber pivota.
-
Rozděl posloupnost na dvě časti: menší než pivot a větší než pivot.
-
Rekurzivně seřad obě části.
-
Zkombinuj obě části. (Reálně nedělá nic, protože už jsou ve stejném poli.)
Korektnost rekurzivních algoritmů
Používá se matematická indukce. Rekurze a matematická indukce jsou si podobné. Jen jdou opačným směrem. Matematická indukce začíná u dna a jde do nekonečna, zatímco rekurze začíná na nějaké -té úrovni a klesá na dno.
Konečnost výpočtu plyne z faktu, že podproblémy se zmenšují.
Správnost výsledku (u řadících algoritmů) dokážeme indukcí vzhledem k délce vstupu:
-
Báze — třeba, že minimum z posloupnosti délky jedna je onen jediný prvek.
-
Předpoklad — algoritmus vrací korektní výsledek pro všechny kratší vstupy délky .
-
Krok — důkaz tvrzení, že algoritmus vrací správný výsledek i pro vstupy délky .
Složitost rekurzivních algoritmů
Složitost zapisujeme pomocí rekurentní rovnice, např.:
A nebo obecně:
kde je složitost konstrukce podproblémů o velikostech a je složitost kombinace výsledků.
Chceme ale explicitní vyjádření funkce , které můžeme získat několika způsoby:
- Substituční metoda
-
,,uhodneme'' řešení a ověříme pomocí matematické indukce.
- Metoda rekurzivního stromu
-
zkonstruujeme strom, jehož vrcholy vyjadřují složitost jednotlivých rekurzivních volání. Výsledná složitost je pak suma ohodnocení vrcholů stromu, kterou pak použijeme jako odhad pro substituční metodu.
- Kuchařková věta (master method)
-
Pokud má tvar , kde a je polynomiální funkce, pak platí: