Prioritätswarteschlangen: Difference between revisions

From Alda
Jump to navigationJump to search
(→‎Sortieren als Suchproblem: in den Abschnitt Suchen verschoben)
Line 1: Line 1:
==Sortieren als Suchproblem==
Systematisches Fragen mit True und False kann auch als Baum dargestellt werden.<br> [[Image:penka.png|400px]]
Hier ein Beispiel.Als Eingabe sind drei Zahlen angegeben a={1,2,3},wobei die Reihenfolge nicht bekannt ist.<br>[[Image:trueFalseBeisp.png|700px]]<br> Also mit Eingabe von drei Elemnten müssen im ungünstigsten Fall drei Schritte vorgenommen werden.<br>Die allgemeine Regel lautet: es gibt N mögliche Lösungen <br>  =>der Baum muss N Blätter haben<br>  =>ein baum mit N Blättern hat mindestens die Höhe logN<br>[[Image:vollbaum.png|left]]
vollständiger Baum (oder balancierter Baum)[http://hci.iwr.uni-heidelberg.de/alda/index.php/Suchen#Balance_eines_Suchbaumes]<br>2^d+1  Knoten<br>2^d  Blätter<br>
==Sortieren==
==Sortieren==
N = n!wenn das Arrey n Elemente hat<br>Zum Beispiel: 3! = 1*2*3 = 6 <br> log6 <math>\approx</math> 2,6 => d = 3  -  bei dem Frage-Baum brauch man im ungünstigsten Fall drei Schritte (True/False)<br>log6 <math>\approx</math> 2,6  -  weil nicht jeder Pfad zu Ende durchgelaufen sein soll, um die Lösung zu bekommen.<br>d<math>\ge</math>log<math>_2</math>n! = log<math>_2</math>(1,2...n) = log<math>_2</math>1 + log<math>_2</math>2 + ... + log<math>_2</math>n = <math>\sum_{n=1}^n log_2n
N = n!wenn das Arrey n Elemente hat<br>Zum Beispiel: 3! = 1*2*3 = 6 <br> log6 <math>\approx</math> 2,6 => d = 3  -  bei dem Frage-Baum brauch man im ungünstigsten Fall drei Schritte (True/False)<br>log6 <math>\approx</math> 2,6  -  weil nicht jeder Pfad zu Ende durchgelaufen sein soll, um die Lösung zu bekommen.<br>d<math>\ge</math>log<math>_2</math>n! = log<math>_2</math>(1,2...n) = log<math>_2</math>1 + log<math>_2</math>2 + ... + log<math>_2</math>n = <math>\sum_{n=1}^n log_2n

Revision as of 18:15, 5 June 2008

Sortieren

N = n!wenn das Arrey n Elemente hat
Zum Beispiel: 3! = 1*2*3 = 6
log6 2,6 => d = 3 - bei dem Frage-Baum brauch man im ungünstigsten Fall drei Schritte (True/False)
log6 2,6 - weil nicht jeder Pfad zu Ende durchgelaufen sein soll, um die Lösung zu bekommen.
dlogn! = log(1,2...n) = log1 + log2 + ... + logn =

Abschätzung von Summen durch Integrale

gegeben : f(x) - monoton wachsend






+ ...+ =
( angenommen und )


wobei f() = f(


= f() = f()x = f(x_1)






für uns gilt: f(x) = log(x)


log1 + = = [xlogx - x] = nlog(n) - = (nlogn)


 d = logn! = (nlogn)

kein Sortieralgorithmus auf Basis paarweise Vergleiche ist asymthotisch schneller als Mergesort

Prioritätswarteschlangen

* Max Priority Quene : insert(x)
                      x = largest()
                      removeLargest()
* Min Priority Quene: smallest()
                     removeSmallets()

Prioritätswarteschlange als Suchproblem

  • Sequentielle Suche - Array mit Prioritäten : insert(x)<=> a.append(x) ( (amortisierte Komplexität))
def largest(a):
if len (a) == 0:
raise RuntimeError("...")
max = a[0]
k = 0
for n in range(1, len(a): (innere Schleife von SelectionSort)
if a[n] > max (Das ganze hat die Komplexität: N = len(a) =>
max = a[n]
k = n
return k

Bei kleine Array ist dies die schnellste Methode

Binärer (balancierter)Suchbaum

insert => z.B. wie beim Anderson Baum [1]

def largest(node):                     # Wurzel
if node.right is not None: #rechts stehen immer die großen
return largest(node.right)
return node #wenn es nicht mehr nach rechts geht, dann haben wir den größten Knoten gefunden

Das ganze hat Komplexität
Ergebnis: gute Komplexität aber komplizierte Datenstruktur

Heap

  • Datenstruktur optimiert für Prioritätssuche - man sucht nicht effizient alle Knoten, sondern nur einen bestimmten z.B. Heap max
  • Definition: ein linkslastiger Binärbaum ist ein Baum mit

Ein Heap ist ein linkslastiger, perfekt balancierter Baum. (lässt sich max. um 1 unterscheiden)

Man kann einen Heap leicht als Array implementieren, wie folgende Grafik veranschaulicht:

index[parent] = [(indexChild - 1)/2]   #[] heißt abgerundet
index[left] = index[parent]2 + 1
index[right] = index[parent]2 + 2

=> linkslastiger perfect balancierter Binärbaum kann effizient als Array abgespeichert werden
=>verwende Indizes wie oben

Heap - Bedingung

  • die Wurzel hat höhere Prioriät als die Kinder(gilt für jeden Teilbaum)

=>Wurzel = array[0] hat die größte Priorität

def largest(h):
return h[0]

Einfügen in einem Heap

h - Array #speichrt Haep

 def insert(h,x):
h.append(x) # wir speichern den Wurzel am Ende, so wird glecih zu einem linkslastigen perfect balancierten Baum (die Haep - Bedingung ist erfüllt)
upheap(h, len(h) - 1):


def upheap(h, k):
"""k-tes Element evtl. an der falsche Stelle
"""
v = h[k]
while True #endlose Schleife
if k == 0:
break
parent = (k - 1)/2
if h[parent]>v:
break
h[k] = h.parent
k = parent
h[k] = v



def removeLargest(h):
    h[0] = h[len(h) - 1]
del h[len(n) - 1]
downHeap(h, 0)


def downHeap(h, k):
v = h[k]
while True
child = 2k + 1 #linke Kind
if child len{h):
break
if child < and h[child] < h[child + 1] #rechtes Kind
child = child + 1 if v h[child]:
break
h[k] = h[child]
k = child
h[k] = v