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