Wiki: Mathe und Info

Unterrichtsmaterialien für Mathematik und Informatik

Benutzer-Werkzeuge

Webseiten-Werkzeuge


info:sek-ii:q3:komplexitaet:l1-suchproblem

Das Suchproblem - Brute Force, Binäre Suche

Manuelle Suche in einem ungeordneten bzw. geordneten Datenbestand

Umfangreiche Datenbestände gibt es in Hülle und Fülle. Oft steht man vor dem Problem, nach einem bestimmten Datensatz im gegebenen Datenbestand zu suchen.

Wir spielen das im Folgenden hier einmal durch. Gegeben ist eine Datei mit Adressen von Personen.

Krause,Stefanie,Brandenburgische Str. 20,74343,Sachsenheim
Brandt,Mandy,Scharnweberstrasse 84,68199,Mannheim Almenhof
Möller,Jens,Schoenebergerstrasse 47,08313,Bernsbach
Herzog,Marco,Scharnweberstrasse 90,61130,Nidderau
Schmitz,Andreas,Meininger Strasse 84,66539,Neunkirchen Ludwigsthal
Ebersbacher,Michelle,Alt-Moabit 10,06691,Zeitz
Koertig,Christine,Hardenbergstraße 82,66887,Niederalben
Schmidt,Vanessa,Paderborner Strasse 44,86359,Gersthofen
Meister,Stephan,Fasanenstrasse 17,22605,Hamburg Othmarschen
Schreiber,Barbara,Stresemannstr. 56,66592,St Wendel
...

Beachte, dass die Adressen hier Pseudo-Adressen sind. Die Personen gibt es in der Wirklichkeit nicht. Auch die Straßenangaben gibt es (in der Regel) in den betreffenden Orten nicht.

Aufgabe 1
  1. Lade die Datei adressdaten_unsortiert.csv herunter und öffne sie mit einem Texteditor. Suche jetzt den Datensatz zur Person "Katja Herrmann aus Queidersbach". Eine vom Texteditor zur Verfügung gestellte Suchfunktion darfst du natürlich nicht benutzen.
  2. Lade auch die sortierte Datei adressdaten_sortiert.csv herunter und öffne sie mit einem Texteditor. Suche jetzt nochmal den Datensatz zur Person "Katja Herrmann aus Queidersbach". Warum fällt einem die Suche jetzt viel leichter?
  3. Begründe, warum man gerade bei großen Datenbeständen Operationen benötigt, die die Datensätze nach bestimmten Kriterien sortiert anordnen.
Algorithmische Suche in einem ungeordneten Datenbestand

Umfangreiche Datenbestände werden heute in der Regel automatisiert verarbeit. Wir spielen auch diese Situation hier durch. Wir betrachten zunächst einen ungeordneten Datenbestand.

Aufgabe 2

a) Entwickle einen Algorithmus als Struktogramm, mit dem man in der gezeigten, unsortierten Datenliste nach einer Person mit einem vorgegebenen Nachnamen suchen kann. Wenn der übergebene Name in der Datenliste vorkommt, dann soll der Index des zugehörigen Datensatzes zurückgegeben werden. Kommt der Name mehrfach vor, dann soll der Index des ersten passenden Datensatzes zurückgegeben werden. Kommt der Name in der Datenliste nicht vor, dann soll der Index -1 zurückgegeben werden.

b) Implementiere den Algorithmus in Processing und teste ihn. Verwende dazu die Vorlage unten.

Tipps:

  • CSV-Dateien kann man in Processing mit Hilfe von Table.loadTable(dateiName) laden. Dazu muss die csv-Datei im Sketch-Ordner liegen.
  • Um in Java zu ermitteln, ob zwei Strings identisch sind, benötigt man diese Methode: public int equals(String anotherString)
Algorithmische Suche in einem geordneten Datenbestand
Der Datenbestand soll jetzt in einer geordneten Form vorliegen (hier: alphabetische Sortierung nach dem Nachnamen).
Aufgabe 3
  1. Betrachte verschiedene Szenarien:
    1. Funktioniert der Algorithmus aus Aufgabe 2 immer noch?
    2. Wann kann man jeweils die Suche abbrechen, wenn man die Daten des Datenbestandes der Reihe nach durchläuft?
  2. Passe den Pseudocode des Suchalgorithmus entsprechend an. Implementiere und teste ihn anschließend in Processing.

Tipp: Um in Java zu ermitteln, ob ein String größer oder kleiner als ein anderer String ist, benötigt man diese Methode: public int compareTo(String anotherString)

Aufgabe 4

Die folgende Funktion benutzt ein Suchverfahren, das den Namen "binäre Suche" hat.

int suchen(String name, Table liste) {
  int links = 0;
  int rechts = liste.getRowCount() - 1;
 
  while (links <= rechts) {
    int mitte = (links + rechts) / 2;
 
    if (liste.getString(mitte, 0).compareTo(name) == 0) {
      return mitte;
    } else if (liste.getString(mitte, 0).compareTo(name) > 0) {
      rechts = mitte - 1;
    } else {
      links = mitte + 1;
    }
  }
 
  return -1;
}
  1. Beschreibe den hier zu Grunde liegenden Algorithmus in eigenen Worten (als Struktogramm!). Verdeutliche ihn auch anhand von Beispielen.
  2. Teste die Funktion mit dem oben gegebenen sortierten Datenbestand.
Aufgabe 5 Vergleich der beiden Algorithmen

Vergleiche die beiden Suchalgorithmen.

  1. Welche Voraussetzungen benötigt der Algorithmus bzgl. der zu durchsuchenden Daten?
  2. Welcher Algorithmus ist einfacher / komplexer und warum?
  3. Welcher Algorithmus ist schneller?
info/sek-ii/q3/komplexitaet/l1-suchproblem.txt · Zuletzt geändert: 2022-11-20 20:35 von christian.weber