Übung Algorithmen und Datenstrukturen - Humboldt

Werbung
ÜbungAlgorithmenundDatenstrukturen
Sommersemester 2016
PatrickSchäfer,Humboldt-Universität zuBerlin
Agenda
1.
2.
3.
Fragen zum zweiten Übungsblatt?
Vorbesprechung des dritten Übungsblatts
Beispielaufgaben
2
Doppelt verkettete sortierte Liste
−∞
FIRST
10
20
70
ListNode
99
∞
LAST
SortedList
3
Knoten: ListNode
prev
next
value
public class ListNode {
// Der Wert des Knoten
public int value;
ListNode
}
// Zeiger auf den Nachfolger
// und den Vorgänger
public ListNode next;
public ListNode prev;
4
Doppelt verkettete sortierte Liste: SortedList
−∞
FIRST
ListNode
20
∞
• Die leere Liste enthält
immer den Start- und
Endknoten.
LAST
ListNode
ListNode
SortedList
public class SortedList
implements LinkedList {
public ListNode first;
public ListNode last;
}
5
Einfügen
SortedList
FIRST −∞
10
70
Löschen
der20
FIRST −∞
10
99
∞
LAST
99
∞
LAST
Einfügen
der20
20
70
SortedList
6
Skip-Listen
SkipList
ObersteEbene
FIRST −∞
20
FIRST −∞
20
UntersteEbene FIRST −∞
10
20
70
∞
LAST
99
∞
LAST
99
∞
LAST
SortedList
7
Knoten: ListNode
up
prev
next
public class ListNode {
// Der Wert des Knoten
public int value;
value
// Zeiger auf den Nachfolger
// und den Vorgänger
public ListNode next;
public ListNode prev;
down
ListNode
}
// Zeiger auf die obere
// und untere Ebene
public ListNode up;
public ListNode down;
8
Skip-Liste: SkipList
topLayer
FIRST
LAST
−∞
∞
SortedList
−∞
FIRST
20
SortedList
∞
LAST
public class SkipList
implements LinkedList {
SortedList topLayer;
}
• Jede Ebene
repräsentiert eine
sortierte doppelt
verkettete Liste.
• Start- und Endknoten
benachbarter Ebenen
sind miteinander
verbunden.
• Kommt ein Knoten auf
einer oberen Ebene
vor, so kommt er auch
auf allen darunter
liegenden Ebenen vor.
• Alle Werte kommen
auf der untersten
Ebene vor.
9
Skip-Listen: Suchen
SkipList
ObersteEbene
FIRST −∞
20
FIRST −∞
20
UntersteEbene FIRST −∞
10
20
70
∞
LAST
99
∞
LAST
99
∞
LAST
SortedList
10
Skip-Listen: Einfügen
SkipList
ObersteEbene
FIRST −∞
20
FIRST −∞
20
∞ LAST
80
99
∞ LAST
99
∞ LAST
50%
UntersteEbene FIRST −∞
10
20
70
80
SortedList
11
Übungsaufgabe: Kreise suchen
Gegeben sei eine einfach verkettete Liste. Nun möchte man seine Liste
dahingehend überprüfen, ob es (z.B. durch einen Bug in der Implementierung)
zu Schleifen gekommen ist. Wie geht das möglichst effizient?
12
Übungsaufgabe: Kreise suchen
Algorithmus𝑓𝑖𝑛𝑑𝑒𝐾𝑟𝑒𝑖𝑠(𝑙)
Input: Listel
Output: Boolean
(1)
(2)
(3)
(4)
(5)
(6)
(7)
(8)
(9)
(10)
slow =l.first()
fast=l.first()
while (fast!=NULLand fast.next !=NULL) do
slow =slow.next
//einSchritt
fast=fast.next.next //zwei Schritte
if(slow==fast)then
returntrue
endif
endwhile
return false;
• Zwei Pointer durchlaufen die
List. In jeder Runde geht ein der
einen Schritt und der zweite
zwei Schritte.
• Sobald der schnelle Pointer den
langsamen Pointer überrundet
gibt es eine Schleife.
• Falls der schnelle Pointer bei
NULL ankommen ist, gibt es
keine Schleife.
13
Tiefensuche
Algorithmus𝑑𝑓𝑠(𝑠𝑡𝑎𝑟𝑡,𝑏𝑒𝑠𝑢𝑐ℎ𝑡)
Input: Arraybesucht, Integerstart
Output:
(1)
(2)
(3)
(4)
(5)
(6)
besucht[start]=true;//start wurdebesucht
foreach (knotenin nachbarn(start)){//alleNachbarn
if (!besucht[knoten]) then //neuerKnoten
DFS(knoten, besucht);
endif
endforeach
• Verfolgt einen Pfad so weit
wie möglich.
• Die zu verarbeitenden
Knoten werden in LIFOReihenfolge (last-in first-out /
Stack) verarbeitet.
• Es gibt zwei
Verarbeitungsstufen:
1. Wenn der Knoten als
Nachfolger entdeckt wird.
2. Wenn der Knoten
abgearbeitet wird.
14
Beispiel: Tiefensuche
Algorithmus𝑑𝑓𝑠(𝑠𝑡𝑎𝑟𝑡,𝑏𝑒𝑠𝑢𝑐ℎ𝑡)
Ende
Input: Arraybesucht, Integerstart
Output:
(1)
(2)
(3)
(4)
(5)
(6)
besucht[start]=true;//start wurdebesucht
foreach (knotenin nachbarn(start)){//alleNachbarn
if (!besucht[knoten]) then //neuerKnoten
DFS(knoten, besucht);
endif
endforeach
Start
15
Aufgabe: Dynamische Programmierung
• Wie kann geprüft werden, ob das Ziel erreicht wurde?
• Wie wird der gefundene Weg zurückgegeben?
• Wie könnten Hindernisse beachtet werden?
16
Zusatzaufgabe
Übungsaufgabe:
Suche
1 + 2 + 3 + 2 = 8 Zusatzpunkte
Als Redakteur einer Handy-Zeitschrift möchten Sie ein neues
Als Redakteur einer Handy-Zeitschrift möchten Sie ein neues
Smartphone
auf seine
Bruchtauglichkeittesten.
testen. Sie
Ihr haben
Testaufbau
Smartphone
auf seine
Bruchtauglichkeit
𝑘
besteht aus
Smartphones
einer Leiter mit n Sprossen,
Smartphones
undkeine
Leiter mitund
𝑛 Sprossen,
durchnummeriert
vonvon
1 bis
𝑛. Innach
jedem
steigen
Sie
durchnummeriert
unten
obenVersuch
von 1 bis
n. In jedem
n
auf eine
Sprosse
und
lassen
ein
Smartphone
gerade
nach
steigen das
Sie auf
eine Sprosse
und lassen
einFall
Smartunten Testversuch
fallen. Entweder
Smartphone
übersteht
den
von der Sprossenh
öhe ausauseinander.
gerade nach unten fallen. Entvöllig phone
unbeschadet
oder es bricht
weder das
übersteht
den Fallbei
völlig
Sie möchten
dieSmartphone
höchste Sprosse
ermitteln,
derunbeschadet
ein
(und kann
für bricht.
weitere Tests wiederverwendet werden), oder es
Smartphone
nicht
auseinander.
i
Da derbricht
Redaktionsschluss
naht, stehen Sie unter Zeitdruck
und möchten
die Anzahl
der Testversuche
minimieren.
Konkret
möchten
Sie die höchste
Nummer
einer Anzahl
Sprosse eri
Anderseits
kosten
Smartphones
viel Geld
undi ihre
mitteln,
bei
der
ein
Smartphone
nicht
bricht.
(Alle
Smartphones
muss auch minimiert werden. Um die Balance zwischen Zeit
und Geld
zuund
verstehen,
untersuchen
Sie im
Folgenden
sind besser
baugleich
zerbrechen
ab der gleichen
Sprosse.)
Falls
das Problem
für
verschiedene
𝑘.
das Smartphone bereits ab der ersten Sprosse bricht, geben Sie
1
Geben0 Sie
für
jeden
der
folgenden
Fälle
ein
Verfahren
an,
zurück.
dass die Anzahl der Testversuche im Worst-Case minimiert
und höchstens
𝑘 Smartphones
verwendet:
Da der Redaktionsschluss
naht,
stehen Sie unter Zeitdruck und möchten die Anzahl der Testversuche minimieren. Anderseits kosten Smartphones viel Geld und ihre Anzahl will auch minimiert
a)𝑘werden.
= 1 Um die Balance
b)𝑘 zwischen
= ∞ Zeit undc)
𝑘=
2 zu verstehen, untersuchen Sie im Folgenden
Geld
besser
17
Übungsaufgabe: Suche
Sequentiell
BinäreSuche
10
9
8
7
6
5
4
3
2
1
10
9
8 X
7
6
5
4
3
2
1
1
Kosten:2 ∑>?@A 𝑖 + 7
Sprung Suche
(7 + 6)/2
(10 + 6)/2
(10 + 1)/2
Kosten:2(5 + 8) + 7
10
9 X
8
7
6
5
4
3
2
1
1
10
10
Kosten:2 3 + 6 + 9 + 7
18
Herunterladen