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: .

  1. Rozděl posloupnost na poloviny. ()

  2. Rekurzivně seřaď obě poloviny. ()

  3. ,,Slij'' obě seřazené posloupnosti do jedné. ()

Quicksort

Složitost: průměrně ; , pokud už posloupnost seřazená je.

  1. Vyber pivota.

  2. Rozděl posloupnost na dvě časti: menší než pivot a větší než pivot.

  3. Rekurzivně seřad obě části.

  4. 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:

  1. Báze — třeba, že minimum z posloupnosti délky jedna je onen jediný prvek.

  2. Předpoklad — algoritmus vrací korektní výsledek pro všechny kratší vstupy délky .

  3. 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í: