Paralelní algoritmy pro minimální rozsah stromů - Parallel algorithms for minimum spanning trees
v teorie grafů A minimální kostra (MST) a graf s a je strom podgraf z který obsahuje všechny jeho vrcholy a má minimální váhu.
MST jsou užitečné a univerzální nástroje využívané v široké škále praktických a teoretických oborů. Například společnost, která chce dodávat více obchodů s určitým produktem z jednoho skladu, může použít MST pocházející ze skladu k výpočtu nejkratších cest do každého obchodního domu. V tomto případě jsou obchody a sklad reprezentovány jako vrcholy a silniční spojení mezi nimi - jako hrany. Každá hrana je označena délkou odpovídajícího silničního spojení.
Li je okrajově nevážený každý kostra má stejný počet hran a tím i stejnou váhu. V vážený na hraně v případě spanning tree, jehož součet hmotností hran je nejnižší ze všech spanning tree of , se nazývá a minimální kostra (MST). Není nutně jedinečný. Obecněji grafy, které nemusí být nutně připojeno mít minimální rozpětí lesy, které se skládají z a svaz MST pro každou z nich připojená součást.
Protože hledání MST je v teorii grafů rozšířeným problémem, existuje jich mnoho sekvenční algoritmy za jeho řešení. Mezi nimi jsou Prim, Kruskal a Borůvka algoritmy, z nichž každý využívá různé vlastnosti MST. Všechny fungují podobným způsobem - podmnožinou se iterativně pěstuje, dokud není objeven platný MST. Jelikož jsou však praktické problémy často poměrně velké (silniční sítě mají někdy miliardy hran), výkon je klíčovým faktorem. Jednou z možností, jak to zlepšit, je paralelizovat známý Algoritmy MST[1].
Primův algoritmus
Tento algoritmus využívá cut-property MST. Níže je uvedena jednoduchá implementace pseudokódu na vysoké úrovni:
kde je náhodný vrchol v opakovat krát najít nejlehčí hranu Svatý. ale vrátit se T
Každá hrana je pozorována přesně dvakrát - konkrétně při zkoumání každého z jejích koncových bodů. Každý vrchol je zkoumán přesně jednou na celkem operace kromě výběru nejsvětlejší hrany při každé iteraci smyčky. Tento výběr se často provádí pomocí a prioritní fronta (PQ). Pro každou hranu nejvýše jeden pokles Klíčová operace (amortizovaný v ) a každá iterace smyčky provede jednu operaci deleteMin (). Tak pomocí Fibonacci se hromadí celková doba běhu Primova algoritmu je asymptoticky v .
Je důležité si uvědomit, že smyčka je ve své podstatě sekvenční a nelze ji správně paralelizovat. To je případ, protože nejsvětlejší hrana s jedním koncovým bodem dovnitř a dál dovnitř se může změnit přidáním hran k . Nelze tedy provádět současně dva výběry nejsvětlejší hrany. Existují však určité pokusy paralelizace.
Jedním z možných nápadů je použít procesory na podporu přístupu PQ ve Windows na PRÁZDNÝ PRAM stroj[2], čímž se sníží celková doba běhu na .
Kruskalův algoritmus
Kruskalův MST algoritmus využívá vlastnost cyklu MST. Níže je uvedena reprezentace pseudokódu na vysoké úrovni.
les s každým vrcholem ve vlastním podstromupro každého ve vzestupném pořadí podle hmotnosti -li a v různých podstromech vrátit se T
Podstromy jsou uloženy v najít odbor datové struktury, což je důvod, proč je v amortizaci možné zkontrolovat, zda jsou dva vrcholy ve stejném podstromu kde je inverzní Ackermannova funkce. Celková doba běhu algoritmu je tedy v . Tady označuje jednohodnotovou inverzní Ackermannovu funkci, pro kterou jakýkoli realistický vstup získá celé číslo menší než pět.
Přístup 1: Paralelizace kroku třídění
Podobně jako Primův algoritmus existují v Kruskalově přístupu komponenty, které nelze v jeho klasické variantě paralelizovat. Například určení, zda jsou dva vrcholy ve stejném podstromu, je obtížné paralelizovat, protože dvě operace sjednocení se mohou pokusit připojit ke stejným podstromům najednou. Opravdu jediná příležitost k paralelizaci spočívá v kroku třídění. Tak jako třídění je lineární v optimálním případě na procesorů lze celkovou dobu běhu snížit na .
Přístup 2: Filtr-Kruskal
Dalším přístupem by bylo upravit původní algoritmus růstem agresivnější. Tuto myšlenku představili Osipov et al.[3][4]. Základní myšlenkou společnosti Filter-Kruskal je rozdělení hran podobným způsobem quicksort a odfiltrovat hrany, které spojují vrcholy, které patří do stejného stromu, aby se snížily náklady na třídění. Níže je uvedena reprezentace pseudokódu na vysoké úrovni.
filtrKruskal ():-li KruskalThreshold: vrátit se kruskal () pivot = chooseRandom (), rozdělit(, pivot) filtrKruskal () filtr() filtrKruskal ()vrátit se rozdělit(, pivot): pro každého : -li hmotnost() pivot: jiný vrátit se (, )filtr():pro každého : -li vyhledávací sada (u) find-set (v): vrátit se
Filtr-Kruskal je vhodnější pro paralelizaci, protože třídění, dělení a filtrování mají intuitivně snadné paralelizace, kde jsou hrany jednoduše rozděleny mezi jádra.
Borůvkův algoritmus
Hlavní myšlenkou Borůvkova algoritmu je kontrakce hran. Okraj je smluvně nejprve odstraněn z grafu a poté přesměrovat každou hranu na . Tyto nové hrany si zachovávají své staré hmotnosti hran. Pokud cílem není jen určit váhu MST, ale také které hrany obsahuje, je třeba poznamenat, mezi kterými dvojicemi vrcholů byla hrana kontrahována. Níže je uvedena reprezentace pseudokódu na vysoké úrovni.
zatímco pro nejlehčí pro smlouva vrátit se T
Je možné, že kontrakce vedou k několika hranám mezi dvojicí vrcholů. Intuitivní způsob výběru nejlehčího z nich není možný . Pokud jsou však všechny kontrakce, které sdílejí vrchol, prováděny paralelně, je to možné. Rekurze se zastaví, když zbývá jen jeden vrchol, což znamená, že algoritmus potřebuje nanejvýš iterace, což vede k celkovému běhu v .
Paralelizace
Jedna možná paralelizace tohoto algoritmu[5][6][7] výnosy a polylogaritmický časová složitost, tj. a existuje konstanta aby . Tady označuje runtime pro graf s hrany, vrcholy na stroji s procesory. Základní myšlenka je následující:
zatímco najít nejlehčí dopadající hrany // přiřadit odpovídající podgraf každému vrcholu // uzavřít smlouvu na každý podgraf //
MST se pak skládá ze všech nalezených nejlehčích hran.
Tato paralelizace využívá reprezentaci grafu pole sousednosti pro . Skládá se ze tří polí - délky pro vrcholy, délky pro koncové body každého z hrany a délky pro hmotnosti okrajů. Nyní pro vrchol druhý konec každé hrany dopadající na lze nalézt v položkách mezi a . Hmotnost -th edge in najdete v . Pak -th edge in je mezi vrcholy a kdyby a jen kdyby a .
Nalezení nejlehčí dopadající hrany
Nejprve jsou hrany rozloženy mezi každou z procesory. The -tý procesor přijímá hrany uložené mezi nimi a . Kromě toho musí každý procesor vědět, ke kterému vrcholu tyto hrany patří (od ukládá pouze jeden z koncových bodů hrany) a ukládá to do pole . Získání těchto informací je možné v použitím binární vyhledávání nebo v pomocí lineárního vyhledávání. V praxi je druhý přístup někdy rychlejší, i když je asymptoticky horší.
Nyní každý procesor určuje nejsvětlejší hranu dopadající na každý ze svých vrcholů.
nalézt(, )pro -li -li
Zde nastává problém, některé vrcholy zpracovává více než jeden procesor. Možným řešením je, že každý procesor má svůj vlastní pole, které je později kombinováno s poli ostatních pomocí redukce. Každý procesor má maximálně dva vrcholy, které zpracovávají také jiné procesory a každá redukce je v . Celková doba běhu tohoto kroku je tedy v .
Přiřazení podgrafů vrcholům
Sledujte graf, který se skládá pouze z hran shromážděných v předchozím kroku. Tyto hrany jsou směrovány pryč od vrcholu, ke kterému jsou nejlehčí dopadající hranou. Výsledný graf se rozloží na několik slabě připojených komponent. Cílem tohoto kroku je přiřadit každému vrcholu složku, jejíž je součástí. Všimněte si, že každý vrchol má přesně jednu odchozí hranu, a proto je každá složka pseudotree - strom s jednou další hranou, která běží paralelně s nejsvětlejší hranou v komponentě, ale v opačném směru. Následující kód mutuje tento další okraj do smyčky:
paralelně pro All -li
Nyní každý slabě připojen komponenta je směrovaný strom, kde má kořen a smyčka. Tento kořen je vybrán jako zástupce každé komponenty. Následující kód používá zdvojení k přiřazení každého vrcholu jeho zástupce:
zatímco pro všechny
Nyní je každý podgraf a hvězda. U některých pokročilých technik tento krok potřebuje čas.
Uzavírání podgrafů
V tomto kroku je každý podgraf kontrahován do jediného vrcholu.
počet podgrafůnajít bijektivní funkci hvězdný kořen
Nalezení bijektivní funkce je možné v pomocí prefixového součtu. Protože nyní máme novou sadu vrcholů a hran, musí být pole sousedství přestavěno, což lze provést pomocí Integersort na v čas.
Složitost
Každá iterace nyní potřebuje času a stejně jako v postupném případě existují interations, což má za následek celkovou dobu běhu . Li účinnost algoritmu je v a je relativně efektivní. Li pak je naprosto efektivní.
Další algoritmy
Existuje několik dalších paralelních algoritmů, které řeší problém hledání MST. S lineárním počtem procesorů je to možné dosáhnout v .[8][9]. Bader und Cong představili algoritmus MST, který byl pětkrát rychlejší na osmi jádrech než optimální sekvenční algoritmus[10].
Další výzvou je model externí paměti - existuje navrhovaný algoritmus podle Dementiev et al. o kterém se tvrdí, že je pouze dvakrát až pětkrát pomalejší než algoritmus, který využívá pouze vnitřní paměť[11]
Reference
- ^ Brusky; Dietzfelbinger; Martin; Mehlhorn; Kurt; Peter (10.06.2014). Algorithmen und Datenstrukturen Die Grundwerkzeuge. Springer Vieweg. ISBN 978-3-642-05472-3.
- ^ Brodal, Gerth Stølting; Träff, Jesper Larsson; Zaroliagis, Christos D. (1998), „Parallel Priority Queue with Constant Time Operations“, Journal of Parallel and Distributed Computing, 49 (1): 4–21, CiteSeerX 10.1.1.48.3272, doi:10.1006 / jpdc.1998.1425
- ^ Osipov, Vitaly; Sanders, Peter; Singler, Johannes (2009), „Algoritmus filtru-kruskal minimální kostry“, Sborník z jedenáctého semináře o algoritmickém inženýrství a experimentech (ALENEX). Společnost pro průmyslovou a aplikovanou matematiku: 52–61, CiteSeerX 10.1.1.218.2574
- ^ Sanders, Peter. „Algorithm Engineering script“ (PDF). Domovská stránka KIT Algorithm Engineering KIT. Citováno 25. února 2019.
- ^ Sanders, Peter. „Skript paralelních algoritmů“ (PDF). Domovská stránka KIT Parallel Algorithms. Citováno 25. února 2019.
- ^ Zadeh, Reza. „Distribuované algoritmy a optimalizace“ (PDF). Distribuované algoritmy a optimalizace Domovská stránka Stanfordské univerzity. Citováno 25. února 2019.
- ^ Chun, slunce; Condon, Anne (1996). Msgstr "Paralelní implementace Bouvkovy algoritmu minimální kostry". Sborník mezinárodní konference o paralelním zpracování: 302–308. doi:10.1109 / IPPS.1996.508073. ISBN 0-8186-7255-2.
- ^ Chong, Ka Wong; Han, Yijie; Lam, Tak Wah (2001), „Souběžná vlákna a algoritmus optimálního paralelního minimálního rozsahu stromů“, Časopis Asociace pro výpočetní techniku, 48 (2): 297–323, CiteSeerX 10.1.1.32.1554, doi:10.1145/375827.375847, PAN 1868718
- ^ Pettie, Seth; Ramachandran, Vijaya (2002), „Optimalizovaný paralelní algoritmus pro práci s časovou prací pro nalezení minimálního lesního porostu“ (PDF), SIAM Journal on Computing, 31 (6): 1879–1895, doi:10.1137 / S0097539700371065, PAN 1954882
- ^ Bader, David A.; Cong, Guojing (2006), „Rychlé algoritmy sdílené paměti pro výpočet minimálního lesu řídkých grafů“, Journal of Parallel and Distributed Computing, 66 (11): 1366–1378, doi:10.1016 / j.jpdc.2006.06.001
- ^ Dementiev, Roman; Sanders, Peter; Schultes, Dominik; Sibeyn, Jop F. (2004), „Inženýrství algoritmu minimálního rozsahu stromu externí paměti“, Proc. IFIP 18. světový počítačový kongres, TC1 3. mezinárodní konference o teoretické informatice (TCS2004) (PDF), str. 195–208.