Junior
Co je to greedy algoritmus a v jakých případech se používá?
sobes.tech AI
Odpověď od AI
Hladový algoritmus je přístup k řešení optimalizačních úloh, který každým krokem vybírá nejlepší lokální řešení (nejvýhodnější z hlediska aktuálního okamžiku) v naději, že tato posloupnost optimálních lokálních řešení povede k globálně optimálnímu řešení. Nezohledňuje možné důsledky současného výběru na budoucí kroky.
Charakteristiky:
- Jednoduchost: Obvykle snazší implementovat než dynamické programování nebo jiné metody optimalizace.
- Rychlost: Často mají nižší výpočetní složitost.
- Záruka optimálnosti: Ne vždy zaručuje nalezení globálně optimálního řešení. Záruka platí pouze pro určité třídy úloh.
Používá se u úloh, kde je dokázáno, že lokálně optimální volba v každém kroku vede k globálně optimálnímu řešení. Příklady:
- Problém výběru aktivit (Activity Selection Problem): Výběr maximálního počtu aktivit, které se nepřekrývají časově.
- Problém s batohem (při dělení předmětů): Když lze předměty dělit. Pokud ne, jedná se o úlohu dynamického programování.
- Algoritmus Prim a Kruskal: Pro hledání minimálního kostrového stromu v grafu.
- Dijkstrův algoritmus: Pro hledání nejkratší cesty v grafu s nezápornými váhami hran.
- Huffmanovo kódování: Pro tvorbu optimálního prefixového kódu.
Příklad pseudokódu pro algoritmus výběru aktivit:
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é ověřit, zda je hladový algoritmus vhodný pro konkrétní úlohu, protože jinak může vést k suboptimálnímu řešení.
# Jednoduchý příklad úlohy, kde hladový algoritmus není optimální
# Úloha s mincemi: vydat co nejmenší počet mincí
# Dostupné mince: [1, 5, 10, 25] USD
# Vydat: například 30 centů
# Hladový algoritmus:
# Vezmeme největší minci <= 30 (25) -> zbytek 5
# Vezmeme největší minci <= 5 (5) -> zbytek 0
# Výsledek: 2 mince (25 + 5). Zde je to optimální.
# Dostupné mince: [1, 6, 10]
# Vydat: 12 centů
# Hladový algoritmus:
# Vezmeme největší minci <= 12 (10) -> zbytek 2
# Vezmeme největší minci <= 2 (1) -> zbytek 1
# Vezmeme největší minci <= 1 (1) -> zbytek 0
# Výsledek: 3 mince (10 + 1 + 1).
# Optimální řešení: 2 mince (6 + 6).
# Tento příklad ukazuje, že hladový algoritmus ne vždy vede k globálnímu optimu,
# pokud vlastnosti úlohy neodpovídají jeho použitelnosti (například,
# běžné nominály měn často umožňují hladový algoritmus,
# ale libovolné nominály nikoli).