The Postal Owl

Logged in: Santa Claus (home)   

Algoritmy a datové struktury 1

Back to the course

DÚ 6: Dijkstra s malými přirozenými čísly

Deadline: 2022-04-07 10:40 (273 days ago)

Pavel Veselý — modified 2022-03-30 17:34 (280 days ago) — reply

Mějme graf s hranami ohodnocenými přirozenými čísly od $1$ do $k$, tedy každá hrana má délku z množiny $\{1, \dots, k\}$ (více hran může mít stejnou délku). Navrhněte implementaci Dijkstrova algoritmu pro hledání nejkratších cest z jednoho vrcholu, aby měl časovou složitost $O(k\cdot n + m)$ (jako vždy je $n$ počet vrcholů a $m$ počet hran). Jeden bonusový bod získáte za paměťovou složitost $O(k + n + m)$. (Pokud se vám nelíbí Dijkstrův algoritmus, vymyslete pro tuto úlohu jiný se stejnou nebo lepší složitostí :-)

Pavel Veselý — 2022-03-30 17:35 (280 days ago) — reply

PS: zadání upřesněno a opravena nepřesně zadaná paměťová složitost

Santa Claus — 2022-04-07 15:31 (273 days ago) — editreply

Upravíme Dijkstru takto:

Prioritní frontu implementujeme jako pole délky $k$, které jako každý prvek bude mít přihrádku na vrcholy. Každá přihrádka bude oboustraně spojový seznam. Abychom pole nemuseli neustále posouvat, použijeme cyklickou implementaci. Budeme si udržovat pointer na aktuálně zpracovávaný vrchol, ten má nejmenší ohodnocení a všechny vrcholy tedy mají větší ohodnocení, ale maximálně o k větší, tedy se vejdou do pole. Nalezení dalšího vrcholu k relaxaci pouze projdeme pole od našeho ukazatele, což je maximálně k kroků, a pak vytáhneme první z přihrádky v konstantním čase. Abychom mohli v konstantním čase provést operaci decrease, máme každý vrchol uložený v oboustraně spojovém seznamu a každý vrchol si také bude pamatovat odkaz na svou reprezentaci v tomto seznamu a číslo své přihrádky. Při decrease se pak jednoduše v konstantním čase odebere z přihrádky (změní odkazy předchozího a následující prvku ve spojáku) a v konstantním čase se přidá do jiné přihrádky (tu nalezne díky pole v konstantním čase). Časová složitost je tedy ta, která byla požadovaná.

Pavel Veselý — 2022-04-12 19:17 (267 days ago) — reply

Výborně, oceňuji stručné, přesto úplné řešení (hodilo by se jen poznamenat, že paměťová složitost je taky ta požadovaná).

Points: 11.00

New post (You can use Markdown with KaTeX math here)

Preview: