Klasse PriorityQueue (als Heap)
Die Prioritätenliste ist hier als Heap implementiert. Dadurch benötigen sowohl insert als auch extract nur O(log(n)) Schritte.
Beim Aufruf des Konstruktors wird mit dem Parameter updown = 1 oder updown = -1 festgelegt, ob mit extract das Paar mit dem höchsten oder mit dem niedrigsten Zahlenwert zurückgegeben werden soll.
class PriorityList(list):
def __init__(self, updown=1):
self.updown=updown
def insert(self, priority, item=None):
x=[priority, item]
self.append(x)
self.upheap()
def extract(self):
self.exchange(self.root(), self.lastLeaf())
q=self.pop()
self.downheap()
return q
def upheap(self):
v=self.lastLeaf()
while not self.isRoot(v):
u=self.pred(v);
if self.p(u)>=self.p(v):
return
else:
self.exchange(u, v)
v=u
def downheap(self):
v=self.root()
while not self.isLeaf(v):
w=self.succ(v);
if self.exists(w+1):
if self.p(w+1)>self.p(w):
w+=1
if self.p(v)>=self.p(w):
return
else:
self.exchange(v, w)
v=w
def p(self, v):
return self.updown*self[v][0]
def exchange(self, u, v):
self[u], self[v]=self[v], self[u]
def lastLeaf(self):
return self.size()-1
def root(self):
return 0
def pred(self, v):
return (v-1)//2
def succ(self, v):
return v*2+1
def isRoot(self, v):
return v==0;
def isLeaf(self, v):
return v>=self.size()//2;
def exists(self, v):
return v<self.size()
def size(self):
return len(self)
def isEmpty(self):
return self.size()==0
if __name__=="__main__":
p=PriorityList(-1)
p.insert(6, "f")
p.insert(5, "e")
p.insert(1, "a")
print(p.extract())
p.insert(3, "c")
p.insert(4, "d")
p.insert(2, "b")
print(p.extract())
print(p.extract())
print(p.extract())
print(p.extract())
print(p.extract())
[up]
H.W. Lang mail@hwlang.de Impressum Datenschutz
Created: 06.02.2009 Updated: 19.02.2023
Diese Webseiten sind während meiner Lehrtätigkeit an der Hochschule Flensburg entstanden