www.wikidata.de-de.nina.az
In der Informatik ist eine Vorrangwarteschlange auch Prioritatenliste Prioritatsschlange Prioritatswarteschlange oder englisch priority queue genannt eine spezielle abstrakte Datenstruktur genauer eine erweiterte Form einer Warteschlange Den Elementen die in die Warteschlange gelegt werden wird ein Schlussel mitgegeben der die Reihenfolge der Abarbeitung der Elemente bestimmt Inhaltsverzeichnis 1 Operationen 2 Implementierung 3 Anwendungen 4 Erweiterungen 5 Parallele Vorrangwarteschlange 5 1 Einzelne Operationen parallelisieren 5 2 Gleichzeitiger paralleler Zugriff 5 3 K Element Operationen 6 Literatur 7 Weblinks 8 EinzelnachweiseOperationen BearbeitenVorrangwarteschlangen mussen die folgenden Operationen unterstutzen insert Einfugen eines Elements extractMin Ruckgabe und Entfernen des Elements mit dem kleinsten Schlussel hochste Prioritat isEmpty Uberprufen ob die Warteschlange leer istDaneben gibt es noch Operationen die vor allem fur Online Algorithmen wichtig sind remove Entfernen eines Elements decreaseKey den Schlusselwert verringern d h die Prioritat erhohen Weitere haufig verwendete Operationen sind peek Zuruckgeben des Elements mit der hochsten Prioritat ohne die Warteschlange zu verandern merge Zusammenfugen von zwei VorrangwarteschlangenImplementierung BearbeitenDie Implementierung von Vorrangwarteschlangen kann uber AVL Baume erfolgen Sowohl insert als auch extractMin konnen dann in O log n Zeit ausgefuhrt werden Eine andere Moglichkeit besteht in der Verwendung partiell geordneter Baume Heaps Auch hier liegt die Zeitkomplexitat bei O log n Beispiele fur Datenstrukturen die Vorrangwarteschlangen effizient implementieren sind AVL Baum Binarer Heap Binomial Heap Fibonacci Heap amortisierte Laufzeit fur remove und extractMin O log n ansonsten O 1 im schlechtesten Fall O n bzw O log n K Level Buckets Linksbaum Radix Heap Van Emde Boas VorrangwarteschlangeDie folgende Tabelle zeigt eine Ubersicht uber die verschiedenen Laufzeiten von einigen Implementierungen in O Notation Operation peek extractMin insert decreaseKey mergeBinarer Heap 1 8 1 8 log n O log n O log n 8 n Linksbaum 2 8 1 8 log n 8 log n O log n 8 log n Binomial Heap 1 3 8 1 8 log n 8 1 a 8 log n O log n bFibonacci Heap 1 4 8 1 O log n a 8 1 8 1 a 8 1 a amortisiert b n ist die Grosse des grosseren HeapsAnwendungen BearbeitenPrioritatswarteschlangen konnen fur die Implementierung diskreter Ereignissimulationen genutzt werden Dabei werden zu den jeweiligen Ereignissen als Schlussel die Zeiten berechnet das Zeit Ereignis Paar in die Vorrangwarteschlange eingefugt und die Vorrangwarteschlange gibt dann das jeweils aktuelle d h als nachstes zu verarbeitende Ereignis aus Allgemein werden Vorrangwarteschlangen fur viele Algorithmen oder sogar Klassen von Algorithmen benotigt Zum Beispiel machen Gierige Algorithmen von Prioritatswarteschlangen Gebrauch da dort haufig das Minimum oder Maximum einer Menge bestimmt werden muss Einer der bekanntesten Algorithmen dieser Art ist der Algorithmus von Dijkstra zur Berechnung kurzester Wege Ebenso kann man Vorrangwarteschlangen fur Bestensuche Algorithmen verwenden Um in einer Iteration den nachsten vielversprechendsten Knoten zu finden wird meist eine Vorrangwarteschlange benutzt Ein Beispiel hierfur ist der A Algorithmus um kurzeste Wege in Graphen zu berechnen Ein spezieller Algorithmus der auch mit Vorrangwarteschlangen implementiert werden kann ist die Huffman Kodierung Die Vorrangwarteschlange wird hierbei dafur verwendet die Zeichen mit der kleinsten Wahrscheinlichkeit zu finden Erweiterungen BearbeitenNeben der klassischen einendigen Vorrangwarteschlange existieren auch zweiendige Diese unterstutzen zusatzlich eine Operation extractMax um das Element mit dem grossten Schlussel herauszuziehen Eine Moglichkeit fur die Implementierung solcher Datenstrukturen bieten Doppelheaps Alternativ konnen auch Datenstrukturen wie Min Max Heaps genutzt werden die direkt zweiendige Prioritatswarteschlangen unterstutzen Parallele Vorrangwarteschlange BearbeitenUm Vorrangwarteschlangen weiter zu beschleunigen kann man sie parallelisieren Dabei gibt es drei verschiedene Moglichkeiten zur Parallelisierung Die erste Moglichkeit ist es einfach die einzelnen Operationen insert extractMin zu parallelisieren Die zweite Moglichkeit erlaubt den gleichzeitigen Zugriff von mehreren Prozessen auf die Vorrangwarteschlange Die letzte Moglichkeit ist es jede Operation auf k Elementen auszufuhren anstatt immer nur auf einem Element Im Falle von extractMin beispielsweise wurde man die ersten k Elemente mit der hochsten Prioritat aus der Vorrangwarteschlange herausnehmen Einzelne Operationen parallelisieren Bearbeiten Ein einfacher Ansatz um Vorrangwarteschlangen zu parallelisieren ist die einzelnen Operationen zu parallelisieren Das heisst die Warteschlange funktioniert genau so wie eine sequentielle allerdings werden die einzelnen Operationen durch den Einsatz von mehreren Prozessoren beschleunigt Der maximale Speedup der hierbei erreicht werden kann ist durch O log n textstyle O log n nbsp beschrankt da es sequentielle Implementierungen fur Vorrangwarteschlangen gibt deren langsamste Operation in O log n textstyle O log n nbsp Zeit lauft z B Binomial Heap Auf einem Concurrent Read Exclusive Write PRAM Modell CREW konnen die Operationen insert extractMin decreaseKey und remove in konstanter Zeit durchgefuhrt werden wenn O log n textstyle O log n nbsp Prozessoren zur Verfugung stehen wobei n textstyle n nbsp die Grosse der Vorrangwarteschlange ist 5 Die Warteschlange ist im Folgenden als Binomial Heap implementiert Dabei muss nach jeder Operation gelten dass maximal drei Baume derselben Ordnung existieren und dass die kleinste Wurzel der Baume von Ordnung i textstyle i nbsp kleiner als alle Wurzeln von Baumen hoherer Ordnung ist insert e Ein neuer Binomialbaum mit Ordnung 0 dessen einziger Knoten das Element e enthalt wird eingefugt Danach werden zwei Baume derselben Ordnung i textstyle i nbsp zu einem Baum der Ordnung i 1 textstyle i 1 nbsp zusammengefugt wenn drei Baume der Ordnung i textstyle i nbsp existieren Der Baum mit der kleinsten Wurzel der Baume mit Ordnung i textstyle i nbsp wird dafur nicht verwendet Dieser Schritt wird parallel ausgefuhrt indem sich jeder Prozessor um die Baume einer Ordnung kummert Somit ist insert in O 1 textstyle O 1 nbsp durchfuhrbar Nachfolgend ist die Operation in Pseudocode aufgefuhrt insert e L 0 L 0 e parallelesZusammenfugen parallelesZusammenfugen fur jede Ordnung i parallel falls L i gt 3 fuge zwei Baume aus L i min L i zu einem neuen Baum b zusammen L i 1 L i 1 b extractMin Das zu entfernende Minimum ist das kleinste Element der Baume von Ordnung 0 Dieses Element wird entfernt Um sicherzustellen dass sich das neue Minimum danach auch in Ordnung 0 befindet wird fur jede Ordnung i i gt 0 textstyle i i gt 0 nbsp der Baum mit der kleinsten Wurzel aufgeteilt und die zwei neuen Baume der Ordnung i 1 textstyle i 1 nbsp hinzugefugt Indem jeder Prozessor genau einer Ordnung zugewiesen wird kann dieser Schritt parallel in O 1 textstyle O 1 nbsp ausgefuhrt werden Nach diesem Schritt werden wie bei der insert Operation zwei Baume der Ordnung i textstyle i nbsp zu einem Baum der Ordnung i 1 textstyle i 1 nbsp zusammengefugt wenn mindestens drei Baume der Ordnung i textstyle i nbsp existieren Da dieser Schritt auch fur jede Ordnung parallel ausgefuhrt werden kann ist extractMin in konstanter Zeit ausfuhrbar extractMin e min L 0 L 0 L 0 e fur jede Ordnung i parallel falls L i gt 1 teile min L i in zwei Baume a b L i L i min L i L i 1 L i 1 a b parallelesZusammenfugen return e Das Konzept fur konstante Insert und ExtractMin Operationen kann erweitert werden um auch eine konstante Laufzeit fur remove zu erreichen Die DecreaseKey Operation kann dann durch ein Remove und ein darauffolgendes Insert ebenso in konstanter Zeit realisiert werden 5 Der Vorteil dieser Parallelisierung ist dass sie genau so wie eine normale sequentielle Vorrangwarteschlange angewendet werden kann Aber es kann auch nur ein Speedup von O log n textstyle O log n nbsp erreicht werden Dieser wird in der Praxis noch weiter dadurch beschrankt dass bei einer parallelen Implementierung zusatzlicher Aufwand fur die Kommunikation zwischen den verschiedenen Prozessoren betrieben werden muss Gleichzeitiger paralleler Zugriff BearbeitenFalls der gleichzeitige Zugriff auf eine Vorrangwarteschlange erlaubt ist konnen mehrere Prozesse gleichzeitig Operationen auf die Vorrangwarteschlange anwenden Dies wirft jedoch zwei Probleme auf Zum einen ist die Semantik der einzelnen Operationen nicht mehr offensichtlich Zum Beispiel wenn zwei Prozesse gleichzeitig extractMin ausfuhren sollten beide Prozesse das gleiche Element erhalten oder unterschiedliche Dies schrankt die Parallelitat auf die Ebene der Anwendung ein welche die Vorrangwarteschlange benutzt Zum anderen gibt es das Problem des Zugriffskonfliktes da mehrere Prozesse Zugriff auf das gleiche Element haben nbsp Knoten 3 wird hinzugefugt und setzt den Zeiger von Knoten 2 auf Knoten 3 Direkt danach wird Knoten 2 geloscht und der Zeiger von Knoten 1 auf Knoten 4 gesetzt Dadurch ist Knoten 3 nicht mehr erreichbar Auf einem Concurrent Read Concurrent Write PRAM Modell CRCW kann der gleichzeitige Zugriff auf eine Vorrangwarteschlange implementiert werden Im Folgenden ist die Vorrangwarteschlange als Skip Liste implementiert 6 7 Zusatzlich wird eine atomare Synchronisationsprimitive CAS benutzt um eine Lock freie Skip Liste zu ermoglichen Die Knoten der Skip Liste bestehen aus einem einzigartigen Schlussel einer Prioritat einem Array aus Zeigern auf die nachsten Knoten und aus einem Delete Kennzeichen Das Delete Kennzeichen gibt an ob der Knoten gerade dabei ist von einem Prozess geloscht zu werden Dadurch wissen die anderen Prozesse dass der Knoten kurz davor ist geloscht zu werden und konnen je nachdem welche Operationen sie ausfuhren entsprechend darauf reagieren insert e Zuerst wird ein neuer Knoten mit einem Schlussel und einer Prioritat erstellt Zusatzlich wird dem Knoten noch eine Anzahl an Level ubergeben Dann wird eine Suche gestartet um die richtige Position in der Skip Liste zu finden wo man den neu erstellten Knoten hinzufugen muss Die Suche startet vom ersten Knoten und vom hochsten Level aus und traversiert die Skip Liste herunter bis zum niedrigsten Level bis die korrekte Position gefunden wurde Dabei wird fur jedes Level der zuletzt traversierte Knoten als Vorgangerknoten gespeichert Zusatzlich wird jener Knoten zu dem der Zeiger des Vorgangerknoten zeigt als Nachfolgerknoten gespeichert Danach wird fur jedes Level des neuen Knotens der Zeiger des gespeicherten Vorgangerknotens auf den neuen Knoten gesetzt Schlussendlich werden noch die Zeiger fur jedes Level des neuen Knotens auf die entsprechenden Nachfolgerknoten gesetzt extractMin Zuerst wird die Skip Liste traversiert bis ein Knoten erreicht wird dessen Delete Kennzeichen nicht gesetzt ist Dann wird das Delete Kennzeichen fur diesen Knoten gesetzt Abschliessend werden die Zeiger des Vorgangerknotens aktualisiert Beim Erlauben vom gleichzeitigen Zugriff auf eine Vorrangwarteschlange muss darauf geachtet werden dass es zu moglichen Konflikten zwischen zwei Prozessen kommen kann Zum Beispiel kann es zu einem Konflikt kommen falls ein Prozess versucht einen Knoten hinzuzufugen aber ein anderer Prozess schon dabei ist seinen Vorgangerknoten zu loschen 6 Die Gefahr besteht dass der neue Knoten zwar zur Skip Liste hinzugefugt wurde aber nun nicht mehr erreichbar ist Siehe Bild K Element Operationen Bearbeiten Bei dieser Art der Parallelisierung von Vorrangwarteschlangen werden neue Operationen eingefuhrt die nicht mehr ein einzelnes Element bearbeiten sondern k textstyle k nbsp Elemente gleichzeitig Die neue Operation k extractMin loscht dann die k textstyle k nbsp kleinsten Elemente aus der Vorrangwarteschlange und gibt sie zuruck Dabei ist die Warteschlange auf verteiltem Speicher parallelisiert Jeder Prozessor hat seinen eigenen privaten Speicher und eine lokale sequentielle Vorrangwarteschlange Die Elemente der globalen Warteschlange sind also auf alle Prozessoren verteilt Bei einer k insert Operation werden die Elemente zufallig gleichverteilt den Prozessoren zugewiesen und jeweils in die lokalen Vorrangwarteschlangen eingefugt Nach wie vor konnen auch einzelne Elemente eingefugt werden Mit dieser Strategie gilt mit hoher Wahrscheinlichkeit dass die global kleinsten Elemente in der Vereinigung der lokal kleinsten Elemente aller Prozessoren sind 8 Jeder Prozessor halt also einen reprasentativen Teil der globalen Vorrangwarteschlange nbsp k extractMin wird auf einer Vorrangwarteschlange mit drei Prozessoren ausgefuhrt Die grunen Elemente werden zuruckgegeben und aus der Warteschlange geloscht Diese Eigenschaft wird bei k extractMin ausgenutzt indem aus jeder lokalen Warteschlange die m textstyle m nbsp kleinsten Elemente entfernt werden und in einer Ergebnismenge gesammelt Dabei bleiben die Elemente aber noch ihrem ursprunglichen Prozessor zugeteilt Die Anzahl m textstyle m nbsp der Elemente die aus jeder lokalen Vorrangwarteschlange geloscht werden ist dabei abhangig von k textstyle k nbsp und der Anzahl der Prozessoren p textstyle p nbsp 8 Durch parallele Selektion werden die k textstyle k nbsp kleinsten Elemente der Ergebnismenge bestimmt Mit hoher Wahrscheinlichkeit sind diese auch global die k textstyle k nbsp kleinsten Elemente Falls nicht werden erneut m textstyle m nbsp Elemente aus jeder lokalen Vorrangwarteschlange geloscht bis die global k textstyle k nbsp kleinsten Elemente in der Ergebnismenge sind Jetzt konnen die k textstyle k nbsp kleinsten Elemente zuruckgegeben werden Alle anderen Elemente werden wieder in die lokalen Vorrangwarteschlangen eingefugt aus denen sie entfernt wurden Die Laufzeit von k extractMin ist erwartet O k p log n textstyle O frac k p log n nbsp wenn k W p log p textstyle k Omega p cdot log p nbsp und n textstyle n nbsp die Grosse der Vorrangwarteschlange beschreibt 8 Die Vorrangwarteschlange kann noch verbessert werden indem die Ergebnismenge nach einer k extractMin Operation nicht immer direkt wieder in die lokale Warteschlange eingefugt wird Dadurch erspart man sich dass Elemente immer wieder aus einer lokalen Warteschlange entfernt und direkt danach wieder eingefugt werden Durch das Entfernen von mehreren Elementen gleichzeitig kann gegenuber sequentiellen Vorrangwarteschlangen eine deutliche Beschleunigung erreicht werden Allerdings konnen nicht alle Algorithmen diese Art von Vorrangwarteschlange nutzen Zum Beispiel konnen beim Dijkstra Algorithmus nicht mehrere Knoten auf einmal bearbeitet werden Dijkstra nimmt den Knoten mit der kleinsten Distanz zum Startknoten aus der Vorrangwarteschlange und relaxiert dann dessen Kanten Dadurch kann sich die Prioritat der Nachbarknoten die sich schon in der Vorrangwarteschlange befinden verandern Durch das Herausnehmen der k textstyle k nbsp Knoten mit der kleinsten Distanz kann es passieren dass sich durch die Bearbeitung eines der k textstyle k nbsp Knoten die Prioritat eines der anderen k textstyle k nbsp Knoten andert Dieser Knoten sollte dann erst spater bearbeitet werden wird nun aber schon fruher bearbeitet Dadurch wird dieser Knoten dann zu fruh als besucht gekennzeichnet In dem Fall hat man zwar einen Weg vom Startknoten zu diesem Knoten gefunden aber die Distanz ist nicht minimal Anders gesagt wird durch das Verwenden von k Element Operationen fur den Algorithmus von Dijkstra die Label Setting Eigenschaft zerstort Literatur BearbeitenGeorge F Luger Kunstliche Intelligenz Strategien zur Losung komplexer Probleme Pearson Studium 2001 ISBN 3 8273 7002 7 Weblinks Bearbeitenjava util PriorityQueue in der Java API bei Oracle englisch Einzelnachweise Bearbeiten a b c Thomas H Cormen Charles E Leiserson Ronald L Rivest Introduction to Algorithms In MIT Press and McGraw Hill 1990 ISBN 0 262 03141 8 Clark A Clane Linear Lists and Priority Queues as Balanced Binary Trees Ph D thesis Hrsg Department of Computer Science Stanford University 1972 ISBN 0 8240 4407 X stanford edu Binomial Heap Brilliant Math amp Science Wiki brilliant org abgerufen am 30 September 2019 amerikanisches Englisch Michael Fredman Robert Tarjan Fibonacci heaps and their uses in improved network optimization algorithms In Journal of the Association for Computing Machinery Band 34 Nr 3 Juli 1987 S 596 615 doi 10 1145 28869 28874 ict ac cn PDF Fibonacci heaps and their uses in improved network optimization algorithms Memento des Originals vom 12 Juli 2019 im Internet Archive nbsp Info Der Archivlink wurde automatisch eingesetzt und noch nicht gepruft Bitte prufe Original und Archivlink gemass Anleitung und entferne dann diesen Hinweis 1 2 Vorlage Webachiv IABot bioinfo ict ac cn a b Gerth Brodal Priority Queues on Parallel Machines In Algorithm Theory SWAT 96 Springer Verlag 1996 S 416 427 doi 10 1007 3 540 61422 2 150 a b Hakan Sundell Philippas Tsigas Fast and lock free concurrent priority queues for multi thread systems In Journal of Parallel and Distributed Computing Band 65 Nr 5 2005 S 609 627 doi 10 1109 IPDPS 2003 1213189 Jonsson Linden A Skiplist Based Concurrent Priority Queue with Minimal Memory Contention In Technical Report 2018 003 2013 uu se a b c Peter Sanders Kurt Mehlhorn Martin Dietzfelbinger Roman Dementiev Sequential and Parallel Algorithms and Data Structures The Basic Toolbox Springer International Publishing 2019 S 226 229 doi 10 1007 978 3 030 25209 0 Abgerufen von https de wikipedia org w index php title Vorrangwarteschlange amp oldid 234827301