Sobes.tech
Junior

Čo je to greedy algoritmus a v akých prípadoch sa používa?

sobes.tech AI

Odpoveď od AI

Hladný algoritmus je prístup k riešeniu optimalizačných úloh, ktorý každým krokom vyberá najlepšie lokálne riešenie (najvýhodnejší z hľadiska aktuálneho okamihu) v nádeji, že táto sekvencia optimálnych lokálnych riešení povedie k globálne optimálnemu riešeniu. Nezohľadňuje možné dôsledky súčasného výberu na budúce kroky.

Charakteristiky:

  • Jednoduchosť: Obvykle jednoduchšie implementovať ako dynamické programovanie alebo iné metódy optimalizácie.
  • Rýchlosť: Často majú nižšiu výpočtovú zložitosť.
  • Záruka optimálnosti: Ne vždy zaručuje nájdenie globálne optimálneho riešenia. Záruka platí len pre určité triedy úloh.

Používa sa pri úlohách, kde je dokázané, že lokálne optimálny výber na každom kroku vedie k globálne optimálnemu riešeniu. Príklady:

  • Úloha o výbere aktivít (Activity Selection Problem): Výber maximálneho počtu aktivít, ktoré sa neprekrývajú v čase.
  • Úloha o batohu (pri delení predmetov): Keď je možné predmety deliť. Ak nie, ide o úlohu dynamického programovania.
  • Algoritmus Príma a Kruskal: Pre hľadanie minimálneho rozvetveného stromu v grafe.
  • Dijkstrův algoritmus: Pre hľadanie najkratšej cesty v grafe s nezápornými váhami hrán.
  • Kódovanie Huffmana: Pre tvorbu optimálneho prefixového kódu.

Príklad pseudokódu pre algoritmus výberu aktivít:

Function SelectActivities(activities):
  Sort activities by finish time
  selected_activities = empty list
  last_finish_time = 0

  For each activity in activities:
    If activity.start_time >= last_finish_time:
      Add activity to selected_activities
      last_finish_time = activity.finish_time

  Return selected_activities

Je dôležité overiť, či je hladný algoritmus vhodný pre konkrétnu úlohu, pretože inak môže viesť k suboptimálnemu riešeniu.

# Jednoduchý príklad úlohy, kde hladný algoritmus nie je optimálny
# Úloha o vydaní mincí: vydanie čo najmenšieho počtu mincí
# Dostupné mince: [1, 5, 10, 25] USD
# Vydanie: napríklad, 30 centov

# Hladný algoritmus:
# Vezmeme najväčšiu mincu <= 30 (25) -> zvyšok 5
# Vezmeme najväčšiu mincu <= 5 (5) -> zvyšok 0
# Výsledok: 2 mince (25 + 5). Toto je optimálne.

# Dostupné mince: [1, 6, 10]
# Vydanie: 12 centov

# Hladný algoritmus:
# Vezmeme najväčšiu mincu <= 12 (10) -> zvyšok 2
# Vezmeme najväčšiu mincu <= 2 (1) -> zvyšok 1
# Vezmeme najväčšiu mincu <= 1 (1) -> zvyšok 0
# Výsledok: 3 mince (10 + 1 + 1).
# Optimálne riešenie: 2 mince (6 + 6).

# Tento príklad ukazuje, že hladný algoritmus nie vždy vedie k globálnemu optima,
# ak vlastnosti úlohy neodpovedajú jeho použiteľnosti (napríklad,
# štandardné nominály mien často umožňujú hladný algoritmus,
# ale ľubovoľné nominály - nie).