5. SUCHEN

Werbung
AlgorithmenundDatenstrukturen
5.SUCHEN
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
5
Datenstrukturen
ArraysundListen
•  EsgibtprinzipiellzweiMöglichkeitenlineare
Datenstrukturenzurealisieren
•  Arrays
•  (verlinkte)Listen
•  ArraysbelegeneinenzusammenhängendenBereichim
Speicher
•  ElementeeinerverlinktenListekönnenbeliebigverteilt
sein
•  ObzurRealisierungeinerlinearenDatenstrukturein
ArrayodereineListeverwendetwird,hängtvonder
Anwendungab
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
6
Datenstrukturen
EinfacheverlinkteListevonZahleninJava
public class IntegerList {
private class IntegerListElement{
int value;
IntegerListElement next;
}
IntegerListElement first;
int size = 0;
…
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
9
Datenstrukturen
ArraysundListen
•  ArrayswerdenmeistfürstaFscheDatenstrukturen
verwendet(=dieLängedesArrayswirdnichtverändert)
•  ListenwerdenmeistfürdynamischeDatenstrukturen
verwendet(=variableLänge)
•  EigenschanenvonArrays:
+ SchnellerZugriffaufEinzelelementedurchIndex
- Einfügenaufwändig
•  EigenschanenvonListen:
- Direktzugriffkannineffizientsein
+ ManipulaFonrelaFveffizient
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
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([email protected])
13
Allgemeines
Suchverfahren
§  SequenFelleSuche
§  BinäreSuche
§  FibonacciSuche
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
14
AlgorithmenundDatenstrukturen
5.1.SEQUENTIELLESUCHE
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
15
Algorithmen
Sequen7elleSuche
•  Idee:
–  ÜberprüfeobdasersteElementderListe
mitdemgesuchtenElementübereinsFmmt;
fallsja,gibaktuellenIndexzurück
–  WiederholemitdemnächstenElement
–  WennmanamEndederFolgedasElementnichtgefunden
hatwardieSucheerfolglos(gib-1zurück)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
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([email protected])
n
19
Analysen
Sequen7elleSuche-Analyse
Theorem(Laufzeit)
DerAlgorithmsSeqSearchhateineWorst-CaseLaufzeit
vonΘ(n).
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
20
AlgorithmenundDatenstrukturen
5.2.BINÄRESUCHE
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
29
Analysen
BinäreSuche-Analyse
Theorem(Laufzeit)
DerAlgorithmsBinarySearchhateineWorst-Case
LaufzeitvonΘ(logn).
Beweis
NachVorüberlegungen.
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
31
AlgorithmenundDatenstrukturen
5.3.FIBONACCI-SUCHE
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
34
13
14
Algorithmen
FibonacciSuche
•  Ansta5wiebeiderbinärenSuchedasArrayingleich
großeTeilezuteilen,wirddasArrayinTeilen
entsprechendderFibonacci-Zahlengeteilt
•  BetrachtezunächstdasElementanIndexposiFonm,wobeim
diegrößteFibonaccizahlist,diekleineralsdieArraylängeist
•  FahrerekursivmitdementsprechendenTeilarrayfort
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
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([email protected])
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([email protected])
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([email protected])
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([email protected])
39
AlgorithmenundDatenstrukturen
5.SUCHEN
ZUSAMMENFASSUNG
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
40
Zusammenfassung
§  SequenFelleSuche
§  FunkFoniertauchbeiunsorFertenFolgen
§  LaufzeitΘ(n)
§  BinäreSuche
§  LaufzeitΘ(logn)
§  Fibonacci-Suche
§  LaufzeitΘ(logn)
AlgorithmenundDatenstrukturen-Ma5hiasThimm([email protected])
41
Herunterladen