www.wikidata.de-de.nina.az
Ein Binarer Heap ist eine Datenstruktur aus der Informatik zum effizienten Sortieren von Elementen Das asymptotisch optimale Sortierverfahren Heapsort verwendet als zentrale Datenstruktur einen binaren Heap Des Weiteren wird der binare Heap zur Implementierung einer Vorrangwarteschlange in der das Element mit der hochsten Prioritat effizient abgefragt und entfernt werden kann verwendet Die Prioritat der Elemente wird diesen durch Schlussel aufgepragt Uber der Menge der Schlussel muss daher eine totale Ordnung bestehen wie sie zum Beispiel die Kleiner Relation lt uber den ganzen Zahlen darstellt Binarer Min HeapIn der Literatur wird oft der Zusatz binar weggelassen so dass je nach Zusammenhang der Heap als archetypische binare Heap Struktur implementiert in einem Array oder die Klasse aller Heap Datenstrukturen gemeint ist Des Weiteren wird bei Verwendung der Ordnungsrelation lt displaystyle lt bzw gt displaystyle gt ein Heap als Min Heap bzw Max Heap bezeichnet Da sich die Operationen im Min und Max Heap nur durch die verwendete Ordnungsrelation unterscheiden wird im Folgenden der binare Heap und die Operationen darauf am Beispiel des Min Heap definiert Inhaltsverzeichnis 1 Definition Min Heap 2 Operationen 3 Struktur 4 Algorithmen 4 1 Heapify 4 2 Build 4 3 Decrease Key 4 4 Insert 4 5 Remove 4 6 Extract Min 4 7 Get Min 5 Siehe auch 6 LiteraturDefinition Min Heap BearbeitenEin Binarbaum H displaystyle H nbsp ist ein Min Heap wenn fur jeden Knoten i displaystyle i nbsp mit i root displaystyle i neq text root nbsp gilt key H i key H parent i displaystyle text key H i geq text key H text parent i nbsp Wobei parent i displaystyle text parent i nbsp den Elternknoten von i displaystyle i nbsp bezeichnet Diese Eigenschaft wird als Min Heap Eigenschaft bezeichnet Ein Heap ist also ein partiell geordneter Baum Zwischen Kinder und Eltern Knoten besteht eine Ordnung aber die Kinder Knoten sind nicht untereinander geordnet Operationen BearbeitenEin 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 Struktur BearbeitenEin Binarer Heap besteht aus einem Binarbaum bei dem alle Schichten bis auf die letzte vollstandig aufgefullt sein mussen Die letzte Schicht des Baumes muss linksbundig aufgefullt werden Diese Struktur garantiert dass der Baum balanciert ist Zusatzlich muss der Binarbaum die Heap Bedingung erfullen am Beispiel des Min Heaps siehe Abbildung muss der Schlussel jedes Kindes eines Knotens grosser gleich dem Schlussel des Knotens selbst sein Die Heap Eigenschaft garantiert dass sich an der Wurzel immer der Knoten mit dem kleinsten Key befindet Haufig wird ein Binarer Heap nicht explizit mit Zeigern konstruiert sondern durch ein Array abgebildet Will man einen Binaren Heap in einem Array speichern so wird die Wurzel des Baums an der ersten Position im Array gespeichert Bei einer Array Indizierung beginnend mit 1 displaystyle 1 nbsp werden die beiden Nachfolger des Knotens an der i displaystyle i nbsp ten Position an der 2 i displaystyle 2i nbsp ten und 2 i 1 displaystyle 2i 1 nbsp ten Position gespeichert entsprechend der Kekule Nummerierung Analog dazu sind die Nachfolger des Knotens mit Index i displaystyle i nbsp an der 2 i 1 displaystyle 2i 1 nbsp ten und 2 i 2 displaystyle 2i 2 nbsp ten Position gespeichert wenn die Array Indizierung mit 0 beginnt nbsp Beispiel fur die implizite Darstellung eines Binarbaums in einem Array Die eingezeichneten Pfeile sind implizit durch die Funktionen fur die Berechnung der Kinder bzw Eltern Indizes gegeben Algorithmen BearbeitenBei der Analyse der Algorithmen wird die Heapgrosse bzw die Anzahl der Elemente im Heap Array mit n displaystyle n nbsp bezeichnet Heapify Bearbeiten Die Basis mehrerer Heap Operationen bildet die Funktion heapify Sie stellt gegebenenfalls die Heap Bedingung eines Binarbaums wieder her vorausgesetzt dass der linke und der rechte Teilbaum die Heap Bedingung erfullen Dazu tauscht heapify solange rekursiv absteigend Kind mit Eltern Knoten bis die Heap Eigenschaft nicht mehr verletzt ist Anders formuliert wenn einer der beiden Kindknoten zur aktuell betrachteten Elternebene aufsteigt sinkt der Elternknoten in der Folge rekursiv so weit herab bis er die Ebene seines Gewichtes erreicht hat Wegen des sukzessiven Tauschens oder Schiebens von einem Knoten in einen Teilbaum herab wird die heapify Operation auch als sift down Sieben bzw Sift Down Phase bezeichnet In Pseudocode void heapify Array H int i assert isheap H left i amp amp isheap H right i int min i if left i lt H size amp amp H key left i lt H key min min left i if right i lt H size amp amp H key right i lt H key min min right i if min i H swap i min heapify H min Die Hilfsfunktionen left bzw right berechnen den Index des linken bzw rechten Kind Knotens im Heap Array key abstrahiert von dem Zugriff auf dieses Array und swap vertauscht zwei Elemente in dem Array in dem der Heap gespeichert ist Die Funktion traversiert den Baum nur in die Tiefe so dass ihre Laufzeit in O height H displaystyle O text height H nbsp ist Da die Hohe des Baums logarithmisch von der Anzahl seiner Elemente abhangt benotigt die Funktion heapify im Worst Case logarithmische Laufzeit bzgl der Grosse des Heaps also O log n displaystyle O log n nbsp heapify benotigt nur eine konstante Anzahl zusatzlicher Speicherzellen weil sie tail rekursiv ist Das heisst dass die Rekursion manuell oder automatisch durch eine Schleife ohne Stack ersetzt werden kann void heapify Array H int a int i a do assert isheap H left i amp amp isheap H right i int min i if left i lt H size amp amp H key left i lt H key min min left i if right i lt H size amp amp H key right i lt H key min min right i if min i break H swap i min i min while true Build Bearbeiten Die Funktion build konstruiert einen Heap aus einem Array indem sie iterativ die Funktion heapify aufruft Sie beginnt bei den Blattern die per Definition die Heap Eigenschaft erfullen und arbeitet sich schrittweise zur Wurzel vor Diese Arbeitsweise wird auch als bottom up bezeichnet Als Pseudocode void build Array a if a empty return for int i a size 2 1 i gt 0 i heapify a i Aus der Struktur des binaren Heap der in einem Array gespeichert ist ergibt sich dass ab Position n 2 1 displaystyle n 2 1 nbsp nur noch Blatter also 1 elementige Heaps gespeichert sind Das heisst ab n 2 1 displaystyle n 2 1 nbsp beginnt die unterste Ebene Level des binaren Baums Da die Baumelemente im Array in level order gespeichert sind lauft die Iteration sukzessive jeweils vom letzten bis ersten Elements eines Levels Die Laufzeit von build ist in O n displaystyle O n nbsp was nicht direkt offensichtlich ist Denn heapify ist in O log n displaystyle O log n nbsp und wird n displaystyle n nbsp mal aufgerufen Die lineare Laufzeit ergibt sich aus folgender Gleichung h 0 log n n 2 h 1 O h O n h 0 log n h 2 h O n displaystyle sum h 0 left lfloor log n right rfloor left lceil frac n 2 h 1 right rceil O h O left n sum h 0 left lfloor log n right rfloor frac h 2 h right O n nbsp wobei h displaystyle h nbsp uber die Baumhohe iteriert und n 2 h 1 displaystyle frac n 2 h 1 nbsp die Anzahl der Teilbaume auf Level h 1 displaystyle h 1 nbsp bzw die Anzahl der Kinder aller Knoten der Hohe h displaystyle h nbsp berechnet Decrease Key Bearbeiten Wird der Schlussel eines Heap Elements i displaystyle i nbsp verringert so muss gegebenenfalls die Heap Eigenschaft in den Vorgangerknoten wiederhergestellt werden Die Heap Eigenschaft in den Kinder Teilbaumen von i displaystyle i nbsp wird durch die decrease key Operation nicht verandert decrease key arbeitet wie build bottom up void decrease Array H int i newkey assert isheap H 0 assert H key i gt newkey H key i newkey while i gt 0 amp amp H key i lt H key parent i H swap i parent i i parent i Insert Bearbeiten Das Einfugen eines Elementes mittels insert erfolgt indem das Heap Array um ein neues Element am Ende mit dem Wert inf displaystyle inf nbsp erweitert wird worauf die Funktion decrease mit dem einzufugenden Schlussel aufgerufen wird damit die moglicherweise verletzte Heap Eigenschaft wieder hergestellt wird void insert Array H newkey assert isheap H int i H size H resize i 1 H key i inf decrease H i newkey Die Laufzeit ist entsprechend O log n displaystyle O log n nbsp Remove Bearbeiten Das Entfernen eines Elementes mittels remove geschieht indem das zu entfernende Element aus seiner Position i im Heap entfernt und an seine Stelle das sich am Ende des Heaps befindende Element gesetzt wird Anschliessend muss die Heap Eigenschaft an Position i wiederhergestellt werden Dabei kann es sowohl vorkommen dass das Element auf Position i grosser ist als sein Elternknoten als auch dass es kleiner ist Dementsprechend muss es mittels heapify nach unten oder mittels decrease nach oben verschoben werden Der decrease Fall mag nicht offensichtlich sein Wieso sollte das vormals letzte Element des Arrays kleiner sein als ein viel weiter oben im Baum geloschtes Element Das liegt daran dass ein Heap nur eine partielle und keine totale Ordnung reprasentiert Betrachtet man den ersten gemeinsamen Vorfahren von zu loschendem und letztem Element so kann es sein dass sich in dem einen Teilbaum mit dem letzten Element nur sehr kleine Elemente befinden wohingegen der andere Teilbaum mit dem zu loschenden Element grossere Elemente enthalt Hier ist ein Beispiel einer solchen Situation Das Element mit dem Index 5 soll geloscht werden h1 0 1 2 2 1 2 2 2 2 1 ist ein korrekter Heap gt 0 1 2 2 1 1 2 2 2 2 nach dem Swap mit dem letzten Element gt 0 1 2 2 1 1 2 2 2 nach dem Entfernen des nun letzten ElementsNach dem Entfernen des letzten Elements verletzt das sich jetzt an Index 5 befindende Element 1 zusammen mit seinem Elternknoten 2 die Heap Eigenschaft Ein Anwenden von heapify wurde das Array nicht andern da die Funktion nur Elemente nach unten schiebt Bei Index 5 handelt es sich aber bereits um einen Blatt Knoten Stattdessen mussen wir das Element an Position 5 nach oben schieben Dies geschieht mit der Funktion decrease Element remove Array H unsigned int i assert isheap H assert i lt H size removedItem H i int lastIdx H size 1 H swap i lastIdx H resize lastIdx Im Fall i lastIdx wurde die Heap Eigenschaft durch das Entfernen des Elements beibehalten und i befindet sich nun out of bounds weil das Array verkleinert wurde Ein Aufruf von heapify oder decrease wurde zum Absturz fuhren if i lastIdx if i 0 H key i gt H key parent i heapify H i else decrease H i H key i decrease macht nichts wenn H key i H key parent i return removedItem Extract Min Bearbeiten Das Zuruckgeben und Entfernen eines Elementes mittels extractMin gestaltet sich ahnlich wie remove Das minimale Element befindet sich wegen der Heap Bedingung an der Wurzel des Baumes und stellt damit das zu entfernende Element dar Element extractMin Array H assert isheap H assert H size gt 0 return remove H 0 Die Laufzeit ist entsprechend O log n displaystyle O log n nbsp Get Min Bearbeiten Die getMin gibt das kleinste Element in einem Heap zuruck Aus der Heap Eigenschaft folgt direkt dass das kleinste Element immer an der ersten Array Position also der Wurzel des binaren Baums steht Im Pseudo Code Element getMin Array H assert isheap H assert H size gt 0 return H key 0 Die Laufzeit ist entsprechend konstant O 1 displaystyle O 1 nbsp Siehe auch BearbeitenBinomial Heap Fibonacci HeapLiteratur 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 englisch Abgerufen von https de wikipedia org w index php title Binarer Heap amp oldid 232956680