AlgorithmenundDatenstrukturen
5.SUCHEN
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
1
Allgemeines
Überblick
• SuchproblemesindeinederamhäufigstenProbleme
inderInformaFk
• Beispiele
1.
2.
3.
4.
SucheninsorFertenFolgen
SuchenvonZeichenke5eninText
SuchevonDokumenteninTextkorpora(z.B.WWW)
AllgemeinSuchevonLösungeninProblemräumen
• Spielbaumsuche
• Plansuche
• Hierzunächstnur1.
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
2
Problemstellungen
Sucheninsor7ertenFolgen
§ Annahmen:
w FolgeFalsFeldvonnumerischenWerten
w FolgeistsorFert,d.h.wenni<jdannF[i]<F[j]
w Zugriffaufi-tesElementüberF[i]
w NurBerücksichFgungdesSuchschlüssels
§ Beispiel:Telefonbuch-SuchenachNamen
§ Zunächst:wierepräsenFertmandieseDaten?
§ KurzerEinschubzu„LinearenDatenstrukturen“
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
3
Datenstrukturen
Defini7on,Beispiel
• EinelineareDatenstrukturListeineSequenzL=(a1,…,an)
• EinelineareDatenstrukturordnetElemente(entweder
primiFveDatentypenoderkomplexereDatenstrukturen)in
einerlinearenAnordnungan
Beispiele:
• Zahlenfolgen:
• Strings:
5
4
6
1
3
2
L
I
N
E
A
R
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
4
Datenstrukturen
AtomareOpera7onenauflinearenDatenstrukturen
Lesen:
• get(i):ElementanPosiFonilesen
• first():erstesElementlesen
• last():letztesElementlesen
• next(e):ElementnachElementelesen
Schreiben:
• set(i,e):ElementanPosiFoniaufesetzen
• add(i,e):ElementeanPosiFonieinfügen
• del(i):ElementanPosiFonilöschen
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
5
Datenstrukturen
ArraysundListen
• EsgibtprinzipiellzweiMöglichkeitenlineare
Datenstrukturenzurealisieren
• Arrays
• (verlinkte)Listen
• ArraysbelegeneinenzusammenhängendenBereichim
Speicher
• ElementeeinerverlinktenListekönnenbeliebigverteilt
sein
• ObzurRealisierungeinerlinearenDatenstrukturein
ArrayodereineListeverwendetwird,hängtvonder
Anwendungab
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
6
Datenstrukturen
EinfacheverlinkteListevonZahleninJava
public class IntegerList {
private class IntegerListElement{
int value;
IntegerListElement next;
}
IntegerListElement first;
int size = 0;
…
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
7
Datenstrukturen
EinfacheverlinkteListevonZahleninJava
…
private IntegerListElement getElement(int i){
if(i >= size)
throw new IllegalArgumentException();
int idx = 0;
IntegerListElement current = first;
while(idx != i){
current = current.next;
idx ++;
}
return current;
}
public int get(int i){
return this.getElement(i).value;
}
…
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
8
Datenstrukturen
EinfacheverlinkteListevonZahleninJava
…
public int add(int pos, int val){
IntegerListElement newElem = new IntegerListElement();
newElem.value = val;
if(pos > 0){
IntegerListElement e = this.getElement(pos-1);
newElem.next = e.next;
e.next = newElem;
}else{
newElem.next = this.first;
this.first = newElem;
}
}
…
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
9
Datenstrukturen
ArraysundListen
• ArrayswerdenmeistfürstaFscheDatenstrukturen
verwendet(=dieLängedesArrayswirdnichtverändert)
• ListenwerdenmeistfürdynamischeDatenstrukturen
verwendet(=variableLänge)
• EigenschanenvonArrays:
+ SchnellerZugriffaufEinzelelementedurchIndex
- Einfügenaufwändig
• EigenschanenvonListen:
- Direktzugriffkannineffizientsein
+ ManipulaFonrelaFveffizient
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
10
Datenstrukturen
Sor7erenundSuchen
• SuchenundSorFerensindvoneinanderabhängige
OperaFonen;Ansätze:
1. ElementeniesorFerenmachtSucheaufwändig
2. ElementesorFerenerleichtertSuche,kannaberselber
aufwändigsein
• FallsElementehinzugefügt/gelöschtwerdenistdiese
ProblemaFknochsichtbarer
1. NureinunsorFertesElementmachtSucheaufwändig
2. BeijederEinfügung/LöschungzusorFerenistaufwändig
• SpezielledynamischeDatenstrukturenerlaubeneine
automaFscheundeffizienteSorFerungbeiEinfügung/
Löschung(sieheKapitel5)
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
11
Datenstrukturen
LineareDatenstruktureninJava
• Arrays:
– int[] arr = new int[10];
– arr[1] = 4;
• Listen:
– List<Integer> myList = new
LinkedList<Integer>();
– myList.add(5);
• NebenLinkedListunterstütztJavaeineReihe
weitererListenimplemenFerungenmit
unterschiedlichenVor-undNachteilen
• Schni5stelleList<Type> beinhaltetdie
gemeinsamenMethoden
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
12
Problemstellungen
Suche
Problembeschreibung
§ Eingabe:FolgeF(mitnElementen)vonZahlenundSuchelementk
§ Ausgabe:
w Sucheerfolgreichodernichterfolgreich
w Erfolgreich:Indexp(0≤p<n)
• Evtl.FestlegungwasbeiMehrfachvorkommenpassiert
(normalerweisedasersteVorkommen)
w Nichterfolgreich:-1
MerkmalederSuche
§ Schlüssel(fürSuchelemente),z.B.Zahlen
§ Sucheisterfolgreichodererfolglos
§ BasiertaufVergleichsoperaFonen
§ Zunächst:DatenalsFeld(Array)oderListedargestellt
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
13
Allgemeines
Suchverfahren
§ SequenFelleSuche
§ BinäreSuche
§ FibonacciSuche
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
14
AlgorithmenundDatenstrukturen
5.1.SEQUENTIELLESUCHE
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
15
Algorithmen
Sequen7elleSuche
• Idee:
– ÜberprüfeobdasersteElementderListe
mitdemgesuchtenElementübereinsFmmt;
fallsja,gibaktuellenIndexzurück
– WiederholemitdemnächstenElement
– WennmanamEndederFolgedasElementnichtgefunden
hatwardieSucheerfolglos(gib-1zurück)
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
16
Algorithmen
Sequen7elleSuche-Algorithmus
int SeqSearch(int[] f, int k) {
/ * output: Position p (0 ≤ p ≤ n-1) */
int n = f.length;
for (int i = 0; i < n; i++) {
if (f[i] == k)
return i;
}
• Int[ ] ist sortierte Folge von int
• int k ist Such-schlüssel
return -1;
• Folge F hat Länge n
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
17
Analysen
Sequen7elleSuche-Analyse
Theorem(Terminierung)
FürendlicheEingabenterminiertderAlgorithmus
SeqSearchnachendlicherZeit.
Theorem(Korrektheit)
FallsdasArrayfeinElementkenthält,gibt
SeqSearch(f,k)denIndexdeserstenVorkommensvon
kzurück.AnsonstengibtSeqSearch(f,k)denWert-1
zurück.
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
18
Analysen
Sequen7elleSuche-Analyse
int SeqSearch(int[] f, int k) {
/ * output: Position p (0 ≤ p ≤ n-1) */
int n = f.length;
for (int i = 0; i < n; i++) {
if (f[i] == k) {
Hinweis:
Folgemussnicht
return i;
SorFertsein!
}
return -1;
Warum(n+1)/2?
Anzahl der Vergleiche
Bester Fall
1
Schlechtester Fall
n
Durchschnitt (erfolgreiche Suche) (n+1)/2
Durchschnitt (erfolglose Suche)
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
n
19
Analysen
Sequen7elleSuche-Analyse
Theorem(Laufzeit)
DerAlgorithmsSeqSearchhateineWorst-CaseLaufzeit
vonΘ(n).
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
20
AlgorithmenundDatenstrukturen
5.2.BINÄRESUCHE
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
21
Algorithmen
BinäreSuche
Wie könnte die Suche effizienter werden?
§ AusnutzungderSorFerung
§ Prinzip:
1. Wähledenmi5lerenEintragundprüfeobgesuchterWert
indererstenoderinderzweitenHälnederListeist.
2. FahrerekursivmitderHälnefort,indersichderEintrag
befindet.
→EntwurfsmusterdesDivide-and-Conquer
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
22
Algorithmen
BinäreSuche-Beispiel
Suchschlüssel k = 8
0
1
2
0
1
3
2
4
4
u
5
6
5
8
9
7
8
9
12
13
18
o
m
0
1
2
4
5
8
9
12
u
0
1
2
4
5
8
um
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
13
m
9
12
o
23
18
o
13
18
Algorithmen
BinäreSuche-rekursiverAlgorithmus
int BinarySearch(int[] f, int k){
/*input: Folge f der Länge n, Schlüssel k */
/*output: Position p */
iniFalerAufruf
return
BinarySearchRec(f, k, 0, f.length-1);
}
int BinarySearchRec (int[] f, int k, int u, int o) {
/* input: Folge f der Länge n, Schlüssel k,
untere Schranke u, obere Schranke o */
/* output: Position p */
m = (u+o)/2;
if (f[m] == k) return m;
if ( u == o) return -1;
if (f[m] > k) return BinarySearchRec(f,k,u,m-1);
return BinarySearchRec(f,k,m+1,o);
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
24
Analysen
BinäreSuche-Analyse
Theorem(Terminierung)
DerAlgorithmusBinarySearchterminiertfürjede
endlicheEingabefnachendlicherZeit.
Beweis
InjedemRekursionsschri5verkürztsichdieLängedes
betrachtetenArraysfummehralsdieHälne.Nach
endlichenvielenSchri5enhatdasArraynurnochein
ElementunddieSucheendetentwedererfolgreich
odererfolglos.FallsdasElementvorhergefundenwird
terminiertderAlgorithmusschonfrüher.
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
25
Analysen
BinäreSuche-Analyse
Theorem(Korrektheit)
FallsdasArrayfeinElementkenthält,gibt
BinarySearch(f,k)denIndexeinesVorkommensvonk
zurück.AnsonstengibtBinarySearch(f,k)denWert-1
zurück.
Beweis
DurchverallgemeinerteIndukFonnachderLängenvon
f.
n=1:DerersteAufrufvonBinarySearchist
BinarySearchRec(f,k,0,0)undsomitm=0.Istf[0]=kso
wird0zurückgegeben,ansonsten-1da0=0.
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
26
Analysen
BinäreSuche-Analyse
n>1:DerersteAufrufvonBinarySearchist
BinarySearchRec(f,k,0,n-1)undsomitm=(n-1)/2.Ist
f[m]=k,sowirdmzurückgegeben.Ansonstenwird
rekursivauff[0...m-1]oderf[m+1...n]fortgefahren.Da
dieFolgesorFertist,kannknurineinemderbeiden
Teilevorhandensein.
GibtBinarySearchauchimmerdenIndexdesersten
Vorkommensvonkzurück(wiediesequenFelle
Suche)?
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
27
Analysen
BinäreSuche-Analyse
WievieleRekursionsschri5esindnöFg?
§ NachdemerstenTeilenderFolge:nochn/2Elemente
§ NachdemzweitenSchri5:n/4Elemente
§ Nachdemdri5enSchri5:n/8Elemente
…
§ Allgemein:imi-tenSchri5max.n/2iElemente
d.h.log2nVergleichebeiderSuche
Anzahl der Vergleiche
Bester Fall
1
Schlechtester Fall ≈ log2n
Durchschnitt (erfolgreiche Suche) ≈ log2n
Durchschnitt (erfolglose Suche) ≈ log2n
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
28
Analysen
BinäreSuche-Analyse
RekursionsgleichungfürBinäreSuche(erfolgloseSuche):
⇢
⇥(1)
falls n = 1
T (n) =
T (n/2) sonst
AuflösenvonT(n)nachIndukFonergibtT(n)=Θ(logn)für
erfolgloseSuche.
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
29
Analysen
BinäreSuche-Analyse
Theorem(Laufzeit)
DerAlgorithmsBinarySearchhateineWorst-Case
LaufzeitvonΘ(logn).
Beweis
NachVorüberlegungen.
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
30
Algorithmen
BinäreSuche–itera7verAlgorithmus
int
BinarySearch(int[] f, int k) {
/* input: Folge f der Länge n, Schlüssel k */
/* output: Position p (0 ≤ p ≤ n-1) */
int u = 0;
int o = f.length-1;
int m;
while (u <= o) {
m = (u+o)/2;
if (f[m] == k)
return m;
else
if (k < f[m])
o = m-1;
else
u = m+1;
IniFalisierung
WiederholenbisSchranken
erreichtsind
Abbruchbedingung
Oberebzw.untereSchranke
Anpassen
→untere/obereHälne
}
return -1;
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
31
AlgorithmenundDatenstrukturen
5.3.FIBONACCI-SUCHE
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
32
Allgemeines
NachteilederbinärenSuche
• BinäreSucheistderamhäufigstenverwendete
AlgorithmuszurSucheinsorFertenArrays
• DieSprüngezuverschiedenenTestposiFonensind
allerdingsimmerrechtgroß
• Dieskannnachteiligsein,wenndasArraynichtvollständigim
Speichervorliegt(oderbeiDatenträgertypenwieKasse5en)
• NeuePosiFonenwerdendurchDivisionberechnet(jenach
ProzessoristdieseineaufwändigereOperaFonalsAddiFon
undSubtrakFon)
• FibonacciSuchealseineweitereAlternaFve
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
33
Algorithmen
Fibonacci-Zahlen
Erinnerung:
• DieFolgederFibonacci-ZahlenFnfürn≥0istdefiniert
durch
•
•
•
•
F0=0
F1=1
F2=1
Fi=Fi-1+Fi-2(füri>1)
i
0
1
2
3
4
5
6
7
8
9
10
11
12
Fi
0
1
1
2
3
5
8
13
21
34
55
89
144 233 377
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
34
13
14
Algorithmen
FibonacciSuche
• Ansta5wiebeiderbinärenSuchedasArrayingleich
großeTeilezuteilen,wirddasArrayinTeilen
entsprechendderFibonacci-Zahlengeteilt
• BetrachtezunächstdasElementanIndexposiFonm,wobeim
diegrößteFibonaccizahlist,diekleineralsdieArraylängeist
• FahrerekursivmitdementsprechendenTeilarrayfort
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
35
Algorithmen
FibonacciSucheinJava(rekursiv)
public int fibonacciSearch(int[] arr,int elem){
return fibonacciSearchRec(arr,elem,0,arr.length-1);
}
public int fibonacciSearchRec(int[] arr,int elem,int u,int o){
int k = 0;
while(fib(k) <= o-u) k++;
if(elem==arr[u+fib(k-1)])
return u+fib(k-1);
if(u==o)
return -1;
if(elem<arr[u+fib(k-1)])
return fibonacciSearchRec(arr,elem,u,u+fib(k-1)-1);
return fibonacciSearchRec(arr,elem,u+fib(k-1)+1,o);
}
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
36
Algorithmen
Beispiel
9
19
21
34
87
102 158 159 199 205
133?
1. fibonacciSearchRec(arr,133,0,9)
1. fib(6)=8 ≤9-0 (und maximal)
2. arr[fib(6)+0] = arr[8] = 199 > 133
2. fibonacciSearchRec(arr,133,0,7)
1. fib(5)=5 ≤ 7-0 (und maximal)
2. arr[fib(5)+0] = arr[5] = 102 < 133
3. fibonacciSearchRec(arr,133,6,7)
1. fib(2)=1 ≤ 7-6 (undmaximal)
2. arr[fib(2)+6] = arr[7] = 159 > 133
4. fibonacciSearchRec(arr,133,6,6)
1. Suche erfolglos
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
i
0
1
2
3
4
5
6
Fi
0
1
1
2
3
5
8
37
Algorithmen
Beispiel
9
19
21
34
87
102 158 159 199 205
87?
1. fibonacciSearchRec(arr,133,0,9)
1. fib(6)=8 ≤ 9-0 (und maximal)
2. arr[fib(6)+0] = arr[8] = 199 > 87
2. fibonacciSearchRec(arr,133,0,7)
1. fib(5)=5 ≤ 7-0 (und maximal)
2. arr[fib(5)+0] = arr[5] = 102 > 87
3. fibonacciSearchRec(arr,133,0,4)
1. fib(4)=3 ≤ 4-0 (undmaximal)
2. arr[fib(4)+0] = arr[3] = 34 < 87
4. fibonacciSearchRec(arr,133,4,4)
1. Suche erfolgreich
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
i
0
1
2
3
4
5
6
Fi
0
1
1
2
3
5
8
38
Analysen
FibonacciSuche-Analyse
• DieFibonacciSuchehatdieselbeKomplexitätwiediebinäre
Suche:
• AnzahlVergleicheimbestenFall:1
• AnzahlVergleichedurchschni5lich(erfolgreich/erfolglos)undim
schlechtestenFall:log2n
• InsgesamtΘ(logn)
• Terminierung-undKorrektheitsbeweiseanalog
• DienöFgenFibonaccizahlenkönnenvorabberechnetundin
einem(staFschen)Arraygespeichertwerden(fürArraysmit
wenigerals100.000.000Elementenwerden“nur”die
ersten50FibonaccizahlenbenöFgt)
• NurSubtrakFon/AddiFonalsOperaFon
• “Sprünge”zwischenArrayposiFonimDurchschni5geringer
alsbeibinärerSuche
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
39
AlgorithmenundDatenstrukturen
5.SUCHEN
ZUSAMMENFASSUNG
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
40
Zusammenfassung
§ SequenFelleSuche
§ FunkFoniertauchbeiunsorFertenFolgen
§ LaufzeitΘ(n)
§ BinäreSuche
§ LaufzeitΘ(logn)
§ Fibonacci-Suche
§ LaufzeitΘ(logn)
AlgorithmenundDatenstrukturen-Ma5hiasThimm(thimm@uni-koblenz.de)
41