heap.py
heap.py — Python Source, 3 KB (3936 bytes)
Dateiinhalt
# Priority-Queue mit Listen-Heap # SH 2012-12-16 class Heap(list): """Klasse implementiert einfache Liste""" def __init__(self): self.append(('start',0)) # fixes Startelement def __repr__(self): # Ausgabe Konsole return str(self[1:]) # wandle in str um # ohne erstes Element! def __str__(self): # Ausgabe via print() ausgabe = "" for i in self[1:]: ausgabe+="%10s:%4.1f\n"%i return "\nPrio-Warteschlange:\n"+ausgabe #return str(self[1:]) # wie oben def einfügen(self, element, prio, verbose=True): # neues Element einfügen "Einfügen eines Knoten am Ende (ws)" self.append((element, prio)) # hinten einfügen self.bubbleUp() # hochblubbern lassen if verbose: # Im Normalfall... print("%10s:%4.1f -> enqueued!"%(element,prio)) # ...gib Rückmeldung def entfernen(self, verbose=True): # kleinstes ausgeben "erstes Listenelement ausgeben" erstes = self.pop(1) # speichern ... self.insert(1,self.pop()) # letztes nach vorne self.sirtDown() # durchsickern lassen if verbose: # Im Normalfall... print("dequeued -> %10s:%4.1f"%erstes) # ...mit Rückmeldung return erstes # Ausgabe def sirtDown(self, index=1): "siebt neuen Knoten nach unten durch" try: # fängt Indexfehler ab if self[index][1] > self[index*2][1]: # Vgl. lnach...? # vater>lnach? self[index],self[index*2] = self[index*2],self[index]#...tauschen # l nach oben if self[index][1] > self[index*2+1][1]: # Vgl. rnach ...? self[index],self[index*2+1] = self[index*2+1],self[index]#...tauschen self.sirtDown(index*2) # Index verdoppeln except: pass def bubbleUp(self): "blubbert neue Einträge nach oben" index=len(self)-1 # letzter Element-Index while index>1: # untere Grenze if self[index][1] < self[index//2][1]: # Prio-Vergleich... self[index],self[index//2] = self[index//2],self[index]#...tauschen index=index//2 # Index halbieren, ganzzahlig else: break # Abbruchbedingung def neuePrio(self, element, prioAlt, prioNeu): "ändert Priorität eines Elements" print("\nPrio-Wechsel bei '%s': %4.1f statt %4.1f\n" %(element, prioNeu, prioAlt)) self.remove((element,prioAlt)) # Element entfernen... self.einfügen(element, prioNeu) # ... mit neuer Prio # wieder einfügen if __name__=="__main__": h=Heap() h.einfügen("sechstes",6) h.neuePrio("sechstes",6,16) h.einfügen("drittes",3) h.einfügen("fünftes",5) h.einfügen("erstes",1) h.einfügen("zweites",2) h.einfügen("viertes",4) h.einfügen("siebtes",7) h.einfügen("achtes",8) print(h) while True: try: h.entfernen() except IndexError: print("Schlange leer!") break