Algoritmus rozděl a panuj

V tomto tutoriálu se dozvíte, jak funguje algoritmus rozdělení a dobývání. Rovněž porovnáme přístup rozděl a panuj s jinými přístupy k řešení rekurzivního problému.

Rozděl a panuj je strategií pro řešení velkého problému

  1. rozdělení problému na menší dílčí problémy
  2. řešení dílčích problémů a
  3. jejich kombinací získáte požadovaný výstup.

K použití algoritmu rozděl a panuj se používá rekurze . Další informace o rekurzi v různých programovacích jazycích:

  • Rekurze v Javě
  • Rekurze v Pythonu
  • Rekurze v C ++

Jak fungují algoritmy rozdělení a dobývání?

Jedná se o tyto kroky:

  1. Rozdělit : Rozdělte daný problém na dílčí problémy pomocí rekurze.
  2. Dobýt : Řešte menší dílčí problémy rekurzivně. Pokud je dílčí problém dostatečně malý, vyřešte ho přímo.
  3. Kombinovat: Kombinujte řešení dílčích problémů, které jsou součástí rekurzivního procesu, k vyřešení skutečného problému.

Pochopme tento koncept pomocí příkladu.

Zde budeme řadit pole pomocí přístupu rozděl a panuj (tj. Sloučit řazení).

  1. Nechť dané pole je: Pole pro sloučení
  2. Rozdělte pole na dvě poloviny. Rozdělte pole na dvě podčásti
    Znovu rozdělte každou podčást rekurzivně na dvě poloviny, dokud nezískáte jednotlivé prvky. Rozdělte pole na menší části
  3. Nyní jednotlivé prvky kombinujte tříděným způsobem. Tady dobývejte a kombinujte kroky vedle sebe. Zkombinujte části

Časová složitost

Složitost algoritmu rozděl a panuj se vypočítá pomocí hlavní věty.

T (n) = aT (n / b) + f (n), kde, n = velikost vstupu a = počet dílčích problémů v rekurzi n / b = velikost každého dílčího problému. Předpokládá se, že všechny dílčí problémy mají stejnou velikost. f (n) = náklady na práci provedenou mimo rekurzivní volání, která zahrnuje náklady na rozdělení problému a náklady na sloučení řešení

Vezměme si příklad, abychom našli časovou složitost rekurzivního problému.

Pro sloučení lze rovnici zapsat jako:

 T (n) = aT (n / b) + f (n) = 2T (n / 2) + O (n) Kde a = 2 (pokaždé je problém rozdělen na 2 dílčí problémy) n / b = n / 2 (velikost každého dílčího problému je polovina vstupu) f (n) = čas potřebný k rozdělení problému a sloučení dílčích problémů T (n / 2) = O (n log n) (Chcete-li tomu porozumět, podívejte se na hlavní věta.) Nyní T (n) = 2T (n log n) + O (n) ≈ O (n log n) 

Dynamický přístup Divide and Conquer Vs

Přístup rozděl a panuj rozděluje problém na menší dílčí problémy; tyto dílčí problémy jsou dále řešeny rekurzivně. Výsledek každého dílčího problému není uložen pro budoucí použití, zatímco v dynamickém přístupu je výsledek každého dílčího problému uložen pro budoucí použití.

Pokud není vyřešen stejný dílčí problém vícekrát, použijte přístup rozděl a panuj. Pokud má být v budoucnu výsledek dílčího problému použit vícekrát, použijte dynamický přístup.

Pochopme to na příkladu. Předpokládejme, že se snažíme najít sérii Fibonacci. Pak,

Přístup Divide and Conquer:

 fib (n) Pokud n <2, návrat 1 Jinak, návrat f (n - 1) + f (n -2) 

Dynamický přístup:

 mem = () fib (n) If n in mem: return mem (n) else, If n <2, f = 1 else, f = f (n - 1) + f (n -2) mem (n) = f návrat f 

V dynamickém přístupu ukládá mem výsledek každého dílčího problému.

Výhody algoritmu Divide and Conquer

  • Složitost pro násobení dvou matic pomocí naivní metody je O (n 3 ), zatímco použití přístupu rozděl a panuj (tj. Strassenova maticová multiplikace) je O (n 2,8074 ). Tento přístup také zjednodušuje další problémy, například Hanojskou věž.
  • Tento přístup je vhodný pro systémy s více procesy.
  • Efektivně využívá mezipaměti paměti.

Rozdělujte a dobývejte aplikace

  • Binární vyhledávání
  • Sloučit třídění
  • Rychlé třídění
  • Strassenovo násobení matice
  • Karatsuba Algorithm

Zajímavé články...