www.wikidata.de-de.nina.az
Ein Heap englisch wortlich Haufen oder Halde in der Informatik ist eine zumeist auf Baumen basierende abstrakte Datenstruktur In einem Heap konnen Objekte oder Elemente abgelegt und aus diesem wieder entnommen werden Sie dienen damit der Speicherung von Mengen Den Elementen ist dabei ein Schlussel zugeordnet der die Prioritat der Elemente festlegt Haufig werden auch die Elemente selbst als Schlussel verwendet Beispiel eines Min HeapsUber die Menge der Schlussel muss daher eine totale Ordnung festgelegt sein uber welche die Reihenfolge der eingefugten Elemente festgelegt wird Beispielsweise konnte die Menge der ganzen Zahlen zusammen mit dem Vergleichsoperator lt als Schlusselmenge fungieren Der Begriff Heap wird haufig als bedeutungsgleich zu einem partiell geordneten Baum verstanden siehe Abbildung Gelegentlich versteht man einschrankend nur eine besondere Implementierungsform eines partiell geordneten Baums namlich die Einbettung in ein Feld Array als Heap Verwendung finden Heaps vor allem dort wo es darauf ankommt schnell ein Element mit hochster Prioritat aus dem Heap zu entnehmen HIFO Prinzip beispielsweise bei Vorrangwarteschlangen Inhaltsverzeichnis 1 Operationen 1 1 Heapify 1 2 Insert 1 3 Remove 1 4 Find max oder Find min 1 5 Extract Min oder Extract Max 2 Heap Bedingung 3 Implementierung 4 Programmierung 5 Varianten von Heaps 5 1 Binarer Heap 5 2 Binomial Heap 5 3 Fibonacci Heap 6 Laufzeitverhalten 7 Anwendung 8 Siehe auch 9 Literatur 10 Weblinks 11 EinzelnachweiseOperationen BearbeitenJe nach Art unterstutzen Heaps eine ganze Reihe von Operationen Die wichtigsten Operationen sind Heapify Bearbeiten Heapify ist eine Operation um die Elemente des Heaps neu anzuordnen um die Heap Bedingung aufrechtzuerhalten Sie erfolgt wenn ein bestimmter Knoten ein Ungleichgewicht im Heap verursacht Die Heapify kann in zwei Methoden erfolgen Up Heapify folgt dem Bottom Up Ansatz In diesem Fall wird gepruft ob die Knoten die Heap Bedingung erfullen indem man in Richtung der Wurzel geht und wenn Knoten nicht die Heap Bedingung erfullen werden bestimmte Operationen ausgefuhrt damit der Baum der Heap Bedingung folgt Down Heapify folgt dem Top Down Ansatz In diesem Fall wird gepruft ob die Knoten die Heap Bedingung erfullen indem man in Richtung der Blatter geht und bestimmte Operationen ausfuhrt um die Heap Bedingung herzustellen Insert Bearbeiten Das Einfugen eines Elements in den Heap erfolgt indem das neue Element an das Ende des Heaps gesetzt wird Weil das neu eingesetzte Element die Eigenschaften des Heaps verzerren kann wird die Operation Up Heapify durchgefuhrt um die Eigenschaften des Heaps in einem Bottom up Ansatz zu erhalten Remove Bearbeiten Das Entfernen eines Elements erfolgt indem das geloschte Element durch das letzte Element im Heap ersetzt wird Dann wird das letzte Element aus dem Heap geloscht Nun wird das letzte Element an einer Stelle im Heap platziert Es kann die Heap Bedingung nicht erfullen sodass die Operation Down Heapify durchgefuhrt wird um die Eigenschaften des Heaps aufrechtzuerhalten Find max oder Find min Bearbeiten Das maximale Element im Max Heap und das minimale Element im Min Heap ist die Wurzel des Heaps Extract Min oder Extract Max Bearbeiten Diese Operation gibt das maximale Element im Max Heap oder das minimale Element im Min Heap zuruck Dieses Element ist die Wurzel des Heaps Daneben werden haufig auch die Operationen changeKey zum Anpassen des Schlussels und merge zum Verschmelzen zweier Heaps bereitgestellt Die Operation changeKey wird haufig durch die Nacheinanderausfuhrung der Operationen remove und insert gebildet wobei nach dem Entfernen und vor dem erneuten Einfugen der Schlussel angepasst wird In einigen Fallen bieten Heaps statt changeKey lediglich die Operation decreaseKey an bei der der Schlussel lediglich verkleinert werden darf Heap Bedingung BearbeitenMan unterscheidet Heaps in Min Heaps und Max Heaps Bei Min Heaps bezeichnet man die Eigenschaft dass die Schlussel der Kinder eines Knotens stets grosser als oder gleich dem Schlussel ihres Vaters sind als Heap Bedingung Dies bewirkt dass an der Wurzel des Baumes stets ein Element mit minimalem Schlussel im Baum zu finden ist Umgekehrt verlangt die Heap Bedingung bei Max Heaps dass die Schlussel der Kinder eines Knotens stets kleiner als oder gleich die ihres Vaters sind Hier befindet sich an der Wurzel des Baumes immer ein Element mit maximalem Schlussel Mathematisch besteht der Unterschied zwischen beiden Varianten nur in ihrer gegensatzlichen Ordnung der Elemente Da die Definition von auf und absteigend rein willkurlich ist ist es also eine Auslegungsfrage ob es sich bei einer konkreten Implementierung um einen Min Heap oder um einen Max Heap handelt Oft kommt es auch vor dass ein Heap die Heap Eigenschaft in beiden Richtungen abbilden soll In diesem Fall werden einfach zwei Heaps geschaffen wobei der eine nach der Kleiner und der andere nach der Grosser Relation anordnet Eine derartige Datenstruktur wird dann Doppelheap oder kurz Deap genannt Bei der Verwendung von Doppel Heaps ist zu beachten dass nicht jede Implementierung von Heaps dabei ihr Laufzeitverhalten fur die einzelnen Operationen behalt Zum Beispiel unterstutzen Fibonacci Heaps nur ein decreaseKey zum Verringern der Schlussel mit amortisiert konstanter Laufzeit Ein allgemeineres changeKey zum Andern des Schlussels welches man im Falle eines derartigen Doppel Heaps benotigen wurde braucht aber amortisiert mindestens logarithmische Laufzeit Eine Variante von Heaps die die Heap Bedingung nur eingeschrankt bzw in abgewandelter Form unterstutzt sind sogenannte Min Max Heaps Dabei handelt es sich um Doppel Heaps die durch die abgewandelte Form der Heap Bedingung die Daten in nur einem Baum halten konnen Implementierung Bearbeiten nbsp Beispiel eines vollstandigen binaren Max Heaps der in einem Feld Array gespeichert wird Heaps werden normalerweise mit einer impliziten Heap Datenstruktur implementiert bei der es sich um eine implizite Datenstruktur handelt die aus einem Feld Array fester Grosse oder einem dynamischen Array besteht wobei jedes Element den Knoten eines Baums darstellt dessen Vater Kind Relation implizit durch seinen Index definiert wird Nachdem ein Element in einen Heap eingefugt oder aus einem Heap geloscht wurde kann die Heap Eigenschaft verletzt werden und der Heap muss durch Austauschen von Elementen innerhalb des Arrays ausgeglichen werden In einer impliziten Heap Datenstruktur enthalt das erste oder letzte Element die Wurzel Die nachsten beiden Elemente des Arrays enthalten seine untergeordneten Elemente Die nachsten vier Elemente enthalten die vier Kinder der beiden Kindknoten usw Somit wurden sich die Kinder des Knotens an Position n an den Positionen 2n und 2n 1 in einem Array mit Startindex 1 oder an den Positionen 2n 1 und 2n 2 in einem Array mit Startindex 0 befinden Die Berechnung des Index des ubergeordneten Knotens des Elements an Position n ist ebenfalls unkompliziert Bei einem Array mit Startindex 1 befindet sich das ubergeordnete Element an Position n 2 Bei einem Array mit Startindex 0 das ubergeordnete Element an der Position n 1 2 Dies ermoglicht das Durchlaufen des Baums durch einfache Indexberechnungen Das Ausbalancieren eines Heaps erfolgt durch Austauschen von Elementen die nicht in Ordnung sind Da wir einen Heap aus einem Array erstellen konnen ohne zusatzlichen Speicher zu benotigen kann Heapsort verwendet werden um ein Array in place zu sortieren Verschiedene Arten von Heaps implementieren die Operationen auf unterschiedliche Weise Insbesondere erfolgt das Einfugen jedoch haufig durch Hinzufugen des neuen Elements am Ende des Heaps im ersten verfugbaren freien Platz Dies verstosst im Allgemeinen gegen die Heap Eigenschaft Daher werden die Elemente nach oben verschoben bis die Heap Eigenschaft wiederhergestellt wurde In ahnlicher Weise wird das Loschen der Wurzel durchgefuhrt indem die Wurzel entfernt und dann das letzte Element in die Wurzel eingefugt und zum Ausgleich gesiebt wird Das Ersetzen erfolgt also durch Loschen der Wurzel und Einfugen des neuen Elements in die Wurzel und Durchsieben wobei ein Aufwartsschritt im Vergleich zum Absenken des letzten Elements gefolgt vom Aufsteigen des neuen Elements vermieden wird Programmierung BearbeitenDas folgende Beispiel in der Programmiersprache C zeigt die Implementierung der wichtigsten Operationen fur einen binaren Min Heap 1 include lt iostream gt using namespace std void swap int int Hilfsfunktion die zwei Elemente vertauscht Deklariert die Klasse fur den Heap class MinHeap int elements Pointer auf das Array fur die Elemente des Heap int capacity Maximale Grosse des Heap int size Grosse die die Anzahl der Elemente des Heap speichert public MinHeap int void MinHeapify int int getParent int index return index 1 2 int getLeftChild int index return 2 index 1 int getRightChild int index return 2 index 2 int extractMinimum void decreaseKey int int int getMinimumKey return elements 0 void deleteKey int void insertKey int MinHeap MinHeap int capacity Konstruktor size 0 capacity capacity elements new int capacity Fugt einen neuen Schlussel ein void MinHeap insertKey int key if size capacity Wenn Kapazitat uberschritten Funktion verlassen return size Erhoht die Grosse des Heap um 1 int index size 1 elements index key Fugt den Schlussel am Ende ein Der eingefugte Schlussel wird so lange nach oben geschoben wie das ubergeordnete Element kleiner ist Damit wird sichergestellt dass die Heap Bedingung erfullt ist while index 0 amp amp elements getParent index gt elements index Wenn das Elternelement grosser als der Schlussel ist werden die Elemente vertauscht swap amp elements index amp elements getParent index index getParent index Aktualisiert den Index des Schlussels Verringert den Wert des Schlussels mit dem gegebenen Index void MinHeap decreaseKey int index int value if value gt elements index Wenn der neue Wert nicht kleiner als der aktuelle Wert ist Funktion verlassen return elements index value while index 0 amp amp elements getParent index gt elements index swap amp elements index amp elements getParent index index getParent index Entfernt das minimale Element vom Heap int MinHeap extractMinimum if size lt 0 return INT MAX if size 1 size return elements 0 Speichert den minimalen Wert und entfernt ihn vom Heap int root elements 0 elements 0 elements size 1 size MinHeapify 0 return root Loscht den Schlussel mit dem gegebenen Index void MinHeap deleteKey int index decreaseKey index INT MIN Setzt den Wert auf minus unendlich extractMinimum Rekursive Methode die die Heap Bedingung fur den Teilbaum mit dem gegebenen Index herstellt Es wird vorausgesetzt dass die Teilbaume die Heap Bedingung schon erfullen void MinHeap MinHeapify int index int leftChild getLeftChild index int rightChild getRightChild index int rightIndex index if leftChild lt size amp amp elements leftChild lt elements index rightIndex leftChild if rightChild lt size amp amp elements rightChild lt elements rightIndex rightIndex rightChild if rightIndex index swap amp elements index amp elements rightIndex Vertauscht das Wurzel Element mit dem Wurzel Element des rechten Teilbaums MinHeapify rightIndex Aufruf der rekursiven Methode fur den rechten Teilbaum Vertauscht zwei Elemente des Heap void swap int element1 int element2 int element element1 element1 element2 element2 element Varianten von Heaps BearbeitenEs existieren zahlreiche Arten von Heaps mit unterschiedlich gutem Laufzeitverhalten fur die verschiedenen Operationen die sie zur Verfugung stellen Beispiele fur Heaps sind Binarer Heap Bearbeiten Ein binarer Heap kann effizient mit linearem Zeitaufwand in O n displaystyle O n nbsp konstruiert werden wobei n displaystyle n nbsp die Anzahl der Elemente aus der Eingabe bezeichnet Folgende Operationen arbeiten auf einem Heap und haben eine Worst Case Laufzeit von O log n displaystyle O log n nbsp insert fugt ein neues Element in den Heap ein remove entfernt ein Element extractMin extrahiert das Element mit dem kleinsten Schlussel decreaseKey verringert den Schlusselwert eines ElementsDie Operation getMin liefert das kleinste Element im Heap zuruck und benotigt dafur konstanten Rechenaufwand Binomial Heap Bearbeiten Binomial Heaps unterstutzen effizient die Operationen insert zum Einfugen eines Elementes remove zum Entfernen eines Elementes extractMin zur Ruckgabe und zum Entfernen eines Elementes mit minimalem Schlussel hochster Prioritat changeKey zum Andern des Schlussels eines Elementes und merge zum Verschmelzen zweier Heaps Alle Operationen lassen sich mit einer Worst Case Laufzeit von O log n displaystyle O log n nbsp implementieren wobei n displaystyle n nbsp die Zahl der aktuell im Heap befindlichen Elemente ist Fibonacci Heap Bearbeiten Ein Fibonacci Heap ist ahnlich wie ein Binomial Heap in einer Vorrangwarteschlange realisiert Das heisst dass Elemente mit festgelegter Prioritat in beliebiger Reihenfolge effizient im Heap gespeichert werden konnen und stets ein Element mit hochster Prioritat entnommen werden kann Die Prioritat der Elemente wird diesen durch Schlussel aufgepragt Uber der Menge der Schlussel muss daher eine Totalordnung bestehen wie sie zum Beispiel die Kleiner Gleich Relation uber den ganzen Zahlen darstellt Weitere Varianten sind der Min Max Heap der Linksbaum der Treap und der Radix Heap Ausserdem gibt es mit Soft Heaps eine Variante bei der ein besseres Laufzeitverhalten erreicht wird indem ein bestimmter Anteil der Schlussel verdorben werden kann Diese verdorbenen Schlussel haben nicht mehr ihren ursprunglichen Wert Laufzeitverhalten BearbeitenDie folgende Tabelle gibt die Laufzeiten von verschiedenen Heaps bezuglich ihrer Operationen an Operation Binarer Heap Binomial Heap Fibonacci Heap Pairing Heap Linksbaum 2 3 Heapamortisiert amortisiert amortisiertextract min O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp remove O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp insert O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp vermutet O 1 displaystyle mathcal O 1 nbsp oder O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp decrease key O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp vermutet O 1 displaystyle mathcal O 1 nbsp oder O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp merge O n displaystyle mathcal O n nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp vermutet O 1 displaystyle mathcal O 1 nbsp oder O log n displaystyle mathcal O log n nbsp Anwendung BearbeitenHeaps haben ein breites Spektrum an Anwendungen Haufig ist vor allem der Einsatz in Vorrangwarteschlangen wie sie bei Servern oder Betriebssystemen zur Festlegung der Ausfuhrungsreihenfolge von Aufgaben benotigt werden Daneben gibt es aber auch Anwendungen die nicht explizit den Einsatz von Warteschlangen verlangen Allgemein stellt ein Heap eine ideale Datenstruktur fur Greedy Algorithmen dar die schrittweise lokale optimierte Entscheidungen treffen So wird zum Beispiel beim Sortieralgorithmus Heapsort ein Binarer Heap zum Sortieren eingesetzt Fibonacci Heaps finden beim Algorithmus von Dijkstra bzw Prim Anwendung Siehe auch BearbeitenListe Datenstruktur Menge Datenstruktur StapelspeicherLiteratur BearbeitenThomas H Cormen Charles E Leiserson Ronald L Rivest Clifford Stein Introduction to Algorithms 2 Auflage MIT Press Cambridge MA 2001 ISBN 0 262 03293 7 S 127 Donald E Knuth The Art of Computer Programming 2 Auflage Volume 3 Sorting and Searching Addison Wesley Reading MA 1997 ISBN 0 201 89685 0 S 144 155 englisch Weblinks Bearbeiten nbsp Commons Heaps Sammlung von Bildern Videos und AudiodateienEinzelnachweise Bearbeiten GeeksforGeeks Binary Heap Abgerufen von https de wikipedia org w index php title Heap Datenstruktur amp oldid 222925113