Klasse PriorityQueue
Die Klasse PriorityQueue implementiert eine Prioritätenliste. PriorityQueue speichert Paare (Zahlenwert, Objekt), die mit der Funktion insert eingegeben werden. Mit der Funktion extract wird jeweils das Paar mit dem höchsten Zahlenwert zurückgegeben und aus der Liste gelöscht.
Die Prioritätenliste ist als binärer Baum mit der Eigenschaft eines Heaps organisiert. Sowohl insert als auch extract benötigen O(log(n)) Schritte, wobei n die Anzahl der Einträge in der Prioritätenliste ist.
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.
Public Class PriorityQueue
Private a As ArrayList
Private updown As Integer
Public Sub New(ByVal updown_ As Integer)
a = New ArrayList()
updown = updown_
End Sub
Public Sub insert(ByVal p As Double, ByVal x As Object)
a.Add(New PqItem(p, x))
upheap()
End Sub
Public Function extract() As PqItem
Dim z As PqItem
exchange(root(), lastLeaf())
z = a.Item(lastLeaf())
a.Remove(z)
downheap()
Return z
End Function
Public Function extractObj() As Object
Return extract().getObject()
End Function
Private Sub upheap()
Dim u, v As Integer
v = lastLeaf()
Do While Not isRoot(v)
u = pred(v)
If p(u) >= p(v) Then
Return
Else
exchange(u, v)
v = u
End If
Loop
End Sub
Private Sub downheap()
Dim w, v As Integer
v = root()
Do While Not isLeaf(v)
w = succ(v)
If exists(w + 1) Then
If p(w + 1) > p(w) Then
w = w + 1
End If
End If
If (p(v) >= p(w)) Then
Return
Else
exchange(v, w)
v = w
End If
Loop
End Sub
Private Function p(ByVal v As Integer) As Double
Return updown*a.Item(v).getPriority()
End Function
Private Sub exchange(ByVal i As Integer, ByVal j As Integer)
Dim h As PqItem
h = a.Item(i)
a.Item(i) = a.Item(j)
a.Item(j) = h
End Sub
Private Function root() As Integer
Return 0
End Function
Private Function lastLeaf() As Integer
Return size() - 1
End Function
Private Function pred(ByVal v As Integer) As Integer
Return (v - 1) \ 2
End Function
Private Function succ(ByVal v As Integer) As Integer
Return v*2 + 1
End Function
Private Function isRoot(ByVal v As Integer) As Integer
Return v = 0
End Function
Private Function isLeaf(ByVal v As Integer) As Boolean
Return v >= size() \ 2
End Function
Private Function exists(ByVal v As Integer) As Boolean
Return v < size()
End Function
Public Function isEmpty() As Boolean
Return size() = 0
End Function
Public Function size() As Integer
Return a.Count
End Function
End Class
Mit folgendem Testprogramm lässt sich die Klasse PriorityQueue vom Typ -1 testen.
Private Sub testPriorityQueue()
Dim s, t As String
Dim p As New PriorityQueue(-1)
p.insert(3, "drei")
p.insert(-1, "minus1")
p.insert(4, "vier")
p.insert(-3, "minus3")
p.insert(2, "zwei")
s = p.extractObj()
t = p.extractObj()
Label2.Text = s & " " & t
End Sub
Die Klasse PriorityQueue verwendet Objekte vom Typ PqItem zur Speicherung der Paare (Zahlenwert, Objekt).
Public Class PqItem
Private p As Double
Private x As Object
Public Sub New(ByVal p_ As Double, ByVal x_ As Object)
p = p_
x = x_
End Sub
Public Function getPriority() As Double
getPriority = p
End Function
Public Function getObject() As Object
getObject = x
End Function
End Class
[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