www.wikidata.de-de.nina.az
Ein Kurzeste Wege Algorithmus ist in der Algorithmik ein Algorithmus der innerhalb eines Graphen die kurzesten Pfade zwischen zwei oder mehreren Knoten findet In vielen Fallen sind die Eingabe Daten fur den Algorithmus zu gross fur den Hauptspeicher sodass sich ein Grossteil der Daten auf einem externen Speicher z B einer Festplatte oder Band Laufwerk befindet Da der Zugriff auf diesen externen Speicher wesentlich langsamer ist werden in der Regel speziell angepasste External Memory oder Out of Core Algorithmen verwendet Bei dieser Art von Algorithmen mochte man in der Regel die Anzahl der langsamen Zugriffe auf den externen Speicher minimieren Inhaltsverzeichnis 1 Allgemein 2 Anpassung des Dijkstra Algorithmus 3 Umsetzung mit Tournament Trees 4 EinzelnachweiseAllgemein BearbeitenEs existieren unterschiedliche Varianten des Kurzeste Wege Problems bezuglich der Start als auch Zielknoten Im Folgenden werden Algorithmen vorgestellt die von einem einzigen Startknoten aus die kurzesten Wege zu allen anderen Knoten berechnet Dieses Problem wir auch als Single Source Shortest Path SSSP bezeichnet nbsp Darstellung des External Memory ModellsZur Modellierung des Speichermodells wird haufig das External Memory Modell verwendet Dabei besitzt das System einen Hauptspeicher mit begrenzten Grosse M textstyle M nbsp jedoch sehr schnellen Zugriffszeiten Zusatzlich existiert ein externer Speicher von beliebiger Grosse auf den der Zugriff langsam und in Blocken der Grosse B textstyle B nbsp erfolgt 1 Anpassung des Dijkstra Algorithmus BearbeitenEine mogliche Losung des SSSP Problems bietet der Dijkstra Algorithmus Die Idee dieses Greedy Algorithmus ist es ausgehend vom Start Knoten immer die Kanten zu verfolgen die zu dem nachsten noch nicht erreichten Knoten mit dem kurzesten Pfad fuhrt Dazu werden die nachsten moglichen Knoten in einer Prioritatswarteschlange gespeichert Man kann den Dijkstra Algorithmus in einen externen Algorithmus abwandeln indem man die verwendete Prioritatswarteschlange durch entsprechend angepasste External Memory Datenstrukturen ersetzt Dabei stosst man jedoch auf folgende Probleme 2 In jedem Schritt des Algorithmus findet ein Zugriff auf alle adjazente verbundenen Kanten eines Knotens statt Im schlechtesten Fall muss dadurch in jedem Schritt eine IO Operation auf den externen Speicher ausgefuhrt werden Dadurch ist die Laufzeit vor allem bei dunnbesetzten Graphen sehr schlecht Bislang gibt es noch keinen bekannten Algorithmus der das Problem auf beliebigen Graphen lost Es gibt allerdings Losungen fur spezielle Graphen wie z B planare Graphen 3 Der Algorithmus speichert immer welche Knoten bereits erreicht wurden Dieses Problem kann gelost werden in dem der Algorithmus phasenweisen ausgefuhrt wird 4 In jeder Phase werden dabei die bereits besuchten Knoten in einer Hashtabelle gespeichert Die Grosse der Hashtabelle ist dabei so beschrankt dass sie in den Hauptspeicher passt Sobald die Hashtabelle voll ist beginnt die nachste Phase In dieser wird zunachst der komplette Graph durchlaufen und es werden alle Kanten entfernt die zu bereits besuchten Knoten fuhren Danach wird die Hashtabelle geleert und weiter der eigentliche Dijkstra Algorithmus ausgefuhrt Die verwendete Prioritatswarteschlange muss eine decrese key Operation unterstutzen also eine Funktion mit der man die Prioritat eines Elements in der Warteschlange nachtraglich verringern kann Dies ist notwendig da wahrend des Algorithmus kurzeren Pfade zu einem Knoten entdecken werden konnen der sich bereits in der Warteschlange befindet Viele bekannte External Memory Prioritatswarteschlange bieten diese Funktion nur mit zusatzlichen IO Operationen an Man kann allerdings wenn wie zuvor genannten wurde ein phasenweiser Algorithmus verwendet wird einen Knoten mehrfach in die Warteschlange einfugen In diesem Fall mussen Knoten ignoriert werden die bereits besucht wurden weil man sie mehrfach in die Warteschlange hinzugefugt hat Beim Wechsel in die nachste Phase kann man in dieser Variante die Warteschlange durchscannen und alle bereits besuchten Knoten entfernen Insgesamt ergibt sich daraus fur den phasenweisen Algorithmus dass O V V M scan V E sort E displaystyle mathcal O left V left lceil frac V M right rceil cdot operatorname scan V E operatorname sort E right nbsp Zugriffe auf den externen Speicher benotigt werden 2 Dabei gibt V displaystyle V nbsp die Anzahl der Knoten E displaystyle E nbsp die Anzahl der Kanten und M displaystyle M nbsp die Grosse des Hauptspeichers an Ausserdem gibt scan n displaystyle operatorname scan n nbsp die Anzahl der notwendigen IO Operationen beim Durchlaufen von n displaystyle n nbsp Werten an und sort n displaystyle operatorname sort n nbsp die Anzahl der IO Operationen beim Sortieren von n displaystyle n nbsp Werten 4 Umsetzung mit Tournament Trees BearbeitenAnstelle einer Prioritatswarteschlange kann man auch andere Datenstrukturen wie die sogenannten Tournament Trees verwenden Bei dieser werden die Elemente in der Warteschlange als Binarbaum dargestellt Die Idee ist dass die Elemente wie bei einem Turnier mit K o System angeordnet sind In jedem Knoten ausser den Blattern sind die Elemente aus den Kindknoten die die hochste Prioritat haben Das Prinzip lasst sich anschaulich an dem Beispiel rechts erkennen Hier haben die Element im Baum mit einer kleineren Zahl eine hohere Prioritat Dadurch befinden sich in der Wurzel des Baums die beiden kleinsten Elemente Bei einem Tournament Tree handelt es sich um einen vollstandigen Baum mit der Ausnahme dass auf der untersten Tiefe von rechts Blatter fehlen durfen nbsp Beispielhafter Aufbau eines Tournament Tree mit zwei Werten pro Knoten ohne Signale In unserem Fall enthalt der Tournament Tree Elemente bestehend aus einem Tupel mit einem Knoten x textstyle x nbsp und einem Schlussel k textstyle k nbsp nach dem die Elemente sortiert werden Der Tournament Tree bietet die folgen Funktionen deletemin Gibt das Element x k displaystyle x k nbsp mit dem kleinsten Schlussel aus und ersetzt es durch x displaystyle x infty nbsp delete x Ersetzt das Element x oldkey displaystyle x oldkey nbsp mit x displaystyle x infty nbsp update x newkey Ersetzt das Element x oldkey displaystyle x oldkey nbsp durch x newkey displaystyle x newkey nbsp sofern newkey lt oldkey displaystyle newkey lt oldkey nbsp Diese Datenstruktur lasst sich effizient mit externem Speicher umsetzen Dafur werden die einzelnen Operationen nicht sofort auf alle Knoten im Baum angewendet sondern als sogenannte Signale in den einzelnen Knoten gespeichert Jeder Knoten besteht dabei aus zwei Puffern in den jeweils die Elemente des Knotens bzw die Signale gespeichert werden In jedem Puffer konnen dabei bis zu M displaystyle M nbsp Objekte gespeichert werden Die Grosse M displaystyle M nbsp muss dabei so gewahlt werden dass ein Knoten vollstandig in den Hauptspeicher passt Zu Beginn werden alle Knoten des Trees mit textstyle infty nbsp als Schlussel initialisiert Die Signal Puffer sind zunachst leer Grundsatzlich werden Signale immer an der Wurzel eingefugt Es gibt zwei verschiedene Arten von Signalen Delete Signale werden immer an die entsprechenden Kindknoten bis zu den Blattern weitergeleitet Bei allen Knoten wird durch dieses Signal das Element aus dem Puffer entfernt Eine Ausnahme bilden die Blatter Hier wird der Schlussel des Elements auf textstyle infty nbsp gesetzt Update Signale werden so lang an die Kindknoten weitergeleitet bis der aktuelle Knoten das zu andernde Element enthalt Ist der aktuelle Schlussel des Elements im Knoten kleiner als der neue Schlussel der im Update Signal enthalten ist so wird das Signal verworfen Ansonsten wird der Schlussel abgeandert und das Signal weitergeleitet Wenn ein Signal an einem Knoten hinzugefugt wird werden die Anderungen an dem Knoten selbst zunachst ausgefuhrt Muss das Signal weitergeleitet werden wird es in den Signal Puffer eingefugt Sobald der Puffer voll ist muss er geleert werden Dies geschieht indem die Signale an die entsprechend zustandigen Kindknoten weitergeleitet werden Dabei ist zu beachten dass bei der Weitergabe der Signale an die Kindknoten muss der Knoten zunachst in den Hauptspeicher geladen werden Hat ein Knoten weniger als M2 textstyle frac M 2 nbsp Elemente im Puffer so muss der Knoten aufgefullt werden Dazu muss zunachst der Signal Puffer wie zuvor beschrieben geleert werden Anschliessend wird der Knoten mit den M textstyle M nbsp Elementen der hochsten Prioritat gefullt Sollte durch das Leeren des Signal Puffers ein Kindknoten weniger als M2 textstyle frac M 2 nbsp Elemente besitzen so muss zuerst rekursiv der Kindknoten aufgefullt werden Die Anzahl benotigter Zugriffe auf den externen Speicher bei einer Abfolge von k textstyle k nbsp Operationen betragt hochstens O kBlog2NB displaystyle mathcal O frac k B log 2 frac N B nbsp Dijkstra kann mit dieser Datenstruktur modifiziert werden um das SSSP Problem im External Memory Modell effizient zu losen Dabei wird die Prioritatswarteschlange durch den Tournament Tree ersetzt Der gesamte Anzahl der IO Operationen die Algorithmus benotigt betragt O V E Blog2 E B displaystyle mathcal O left V frac E B log 2 frac E B right nbsp wobei B textstyle B nbsp die Blockgrosse ist die bei einer IO Operation ubertragen wird 5 Einzelnachweise Bearbeiten Peter Sanders Memory Hierarchies Models and Lower Bounds In Algorithms for Memory Hierarchies Advanced Lectures Lecture Notes in Computer Science Springer Berlin Heidelberg Berlin Heidelberg 2003 ISBN 978 3 540 36574 7 S 5 7 doi 10 1007 3 540 36574 5 1 a b Irit Katriel Ulrich Meyer Elementary Graph Algorithms in External Memory In Algorithms for Memory Hierarchies Advanced Lectures Lecture Notes in Computer Science Springer Berlin Heidelberg Berlin Heidelberg 2003 ISBN 978 3 540 36574 7 S 62 84 doi 10 1007 3 540 36574 5 4 Lars Arge Gerth Stolting Brodal Laura Toma On external memory MST SSSP and multi way planar graph separation In Journal of Algorithms Band 53 Nr 2 1 November 2004 ISSN 0196 6774 S 186 206 doi 10 1016 j jalgor 2004 04 001 sciencedirect com abgerufen am 30 Juli 2019 a b Yi Jen Chiang Michael T Goodrich Edward F Grove Roberto Tamassia Darren Erik Vengroff External memory Graph Algorithms In Proceedings of the Sixth Annual ACM SIAM Symposium on Discrete Algorithms SODA 95 Society for Industrial and Applied Mathematics Philadelphia PA USA 1995 ISBN 978 0 89871 349 7 S 139 149 acm org abgerufen am 30 Juli 2019 Vijay Kumar Eric J Schwabe Improved Algorithms and Data Structures for Solving Graph Problems in External Memory In Proceedings of the 8th IEEE Symposium on Parallel and Distributed Processing SPDP 96 SPDP 96 IEEE Computer Society Washington DC USA 1996 ISBN 978 0 8186 7683 3 S 169 acm org abgerufen am 30 Juli 2019 Abgerufen von https de wikipedia org w index php title Kurzeste Wege Algorithmen mit externem Speicher amp oldid 191002658