Priority Queue auf Heapbasis
Übersicht

![]() |
hamZtaAdministratorBetreff: Priority Queue auf Heapbasis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo!
Ich habe mal aus Langeweile eine Priority Queue auf Heapbasis implementiert. Was ist das? Im Endeffekt nichts anderes als ein ein wenig ausgebauter Sortieralgorithmus ![]() Eine "Heap" (dt. "Halde") ist eine Datenstruktur zur Speicherung von Daten mit Schlüsseln. In diesem Fall handelt es sich um einen Binary Tree mit Prioritätswerten als Schlüssel. (wer genaueres wissen will lese hier: Wikipedia "Heap") Man fügt in seine Heap ein paar "Nodes" (THeapNode) ein und vergibt diesen verschiedene Prioritäten. Dann kann man mit der Methode removeHighest() immer den Node von der Heap holen, der die höchste (d.h. den niedrigsten Prioritätswert, 0 = höchste Priorität) Priorität hat. Dabei wird dieser Node von der Heap gelöscht und der nächste Aufruf von removeHighest() liefert den Node mit der nächsthöheren Priorität. Das geht solange bis keine Nodes mehr auf der Heap liegen. Ich habe ein kleines Beispiel dazu programmiert: BlitzMax: [AUSKLAPPEN] SuperStrict Hier werden erstmal ein paar Prioritäten definiert (muss man natürlich nicht machen, ist aber sauberer ). Dann folgt der Type TAction der von THeapNode erbt. Dieser erweitert THeapNode um die Methode execute() welche nichts anderes macht, als einen vorher übergebenen Text auszugeben. Jetzt werden ein paar dieser TActions mit verschiedenen Prioritäten erstellt. Schließlich werden solange TActions von der Heap "ausgeführt" bis keine mehr übrig sind. Das Ergebnis lässt sich leicht erraten: Code: [AUSKLAPPEN] *** URGENT ***
*** URGENT *** High priority High priority Normal priority Normal priority Low priority #2 Low priority Wofür kann man das brauchen? Wie im Beispiel gesehen, werden höhere Prioritäten niederen bevorzugt. Man kann diesen Effekt nutzen um z.B. dringende Nachrichten (übers Netzwerk o.ä.) vor weniger wichtigen zu verschicken. Man kann mit etwas Programmierung wichtigere Methoden öfter als weniger wichtige aufrufen. Sollte BlitzMax später mal ordentlich mit Threads umgehen können könnte man die Queue für eine Priorisierung der Threads nutzen. Oder man benutzt sie ganz einfach zum Sortieren. Hier nun der eigentliche Code (bitte entschuldigt die englischen Kommentare): BlitzMax: [AUSKLAPPEN] Const BLOCK_SIZE:Int = 16 |
||
Blog. |
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Cool, war selbst bisher zu faul sowas zu implementieren ![]() Ist aber ne wichtige und praktische Sache, ziemlich elementar. |
||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group