Start > Algorithmik > Suchalgorithmen

Suchalgorithmen

  1. Einleitung
  2. Einteilung
  3. Elementare Suchalgorithmen
    1. Sequentielle Suche
  4. Höhere Suchalgorithmen
    1. Binäre Suche
    2. Interpolationssuche
    3. Hash-Suche
    4. Suche n. Knuth-Morris-Pratt
    5. Suche n. Boyer-Moore

Einleitung

In kurzer Zeit nach bestimmten Daten zu suchen, gehört zu den wichtigsten Aufgaben vieler Programme. In der Informatik gibt es viele, gut analysierte Algo­rithmen dafür. Studien sagen aus, daß Rechner zu 25% ihrer CPU-Zeit mit Suchen und Sortieren von Daten beschäftigt sind. In der Regel soll dabei ein Array nach einem bestimmten Element durchsucht werden. Als wichtigste Vertreter der Such­algo­rithmen seien neben der (trivialen und langsamsten) sequentiellen Suche nur die binäre Suche, die Interpolations­suche, Hashing (Scattered Storage) und für Suchen in Zeichenketten der A. nach Knuth-Morris-Pratt und der A. nach Boyer-Moore genannt.

Einteilung

Die wesentlichsten Einteilungs­kriterien sind analog zu denen der Sortier­verfahren.

Elementare Suchalgorithmen

Sequentielle Suche

Die sequentielle oder lineare Suche ist die trivialste Such­funktion überhaupt und kann auf einen ungeord­netes Array angewandt werden. Sie ist von der Komplexität n/2, da im Schnitt n/2 Elemente verglichen werden müssen, um ein bestimmtes Element zu finden. Daher empfiehlt sich die sequentielle Suche nur in Prototypen oder falls das zu durchsuchende Array sehr klein ist. Für schnellere Such­funktionen sollte die sequentielle Suche durch ein anderes Verfahren ersetzt werden.

Beispiel für eine sequentielle Suche nach einem int-Datum in einem int-Array durch eine sequentielle Such­funktion searchi, die als Parameter das zu durchsuchende Array a, dessen Anzahl an Elementen n und das gesuchte Element key übernimmt und die Position des gesuchten Elements zurückliefert, falls gefunden, anderenfalls -1:

#include <stdio.h>

#define ITEMCOUNT(a) (sizeof(a)/sizeof(a[0]))

int searchi(int a[], int n, int key)
  {
  int i;

  for (i=0; i<n; i++)
    if (a[i] == key)  /* Vergleich */
      return i;  /* Gefunden */

  return -1;  /* Nicht gefunden */
  }

void main()
  {
  int ai[10]={0,11,22,33,44,55,66,77,88,99};

  /* Suchen nach dem Datum 33 und Ausgabe der Position */
  printf("%d gefunden an Position %d\n", 33,
    searchi(ai,ITEMCOUNT(ai),33));
  }

Aufgabe: Der Compiler, mit dem Sie gerade arbeiten, verwendet intern eine String-Suchfunktion, um im Quelltext die Schlüssel­worte zu erkennen. Schreiben Sie eine sequentielle Such­funktion searchs, die nach einem String in einem Array von Strings sucht [Lösung].

Aufgabe: Überlegen Sie, wie Sie in einem sortierten Array schneller nach einem bestimmten Element suchen können. Nehmen wir an, Sie suchen das Datum 33 in einem Array mit den Werten 0, 11, 22, 33, 44, 55, 66, 77, 88 und 99. Sie ermitteln den Wert des mittleren Element des Arrays (sog. Median), die 44 (oder 55) und vergleichen ihn mit dem gesuchten Datum. In welcher Teilhälfte des Arrays müssen Sie nur weitersuchen? Schreiben Sie eine Funktion, die nach dieser Methode einen int-Wert in einem int-Array sucht.

Höhere Suchalgorithmen

Binäre Suche

#include <stdio.h>
#define ITEMCOUNT(a) (sizeof(a)/sizeof(a[0]))

/* Vorbedingung: sortiertes Array */
int bsearchi(int a[], int n, int key)
  {
  int low=0, mid, high=n-1;

  while (low <= high) {
    mid = (low + high) / 2;
    if (key < a[mid])  /* Vergleich */
      high = mid - 1;  /* Durchsuche linken Teil */
    else if (key > a[mid])
      low = mid + 1;  /* Durchsuche rechten Teil */
    else  /* Gefunden */
      return mid;
    }

  return -1;  /* Nicht gefunden */
  }

void main()
  {
  int ai[]={0,11,22,33,44,55,66,77,88,99};

  printf("%d gefunden an Position %d\n", 33,
   bsearchi(ai,ITEMCOUNT(ai),33));
  }

Aufgabe: Schreiben Sie eine binäre String-Suchfunktion bsearchs [Lösung].

Aufgabe: Entwickeln Sie eine binäre Suchfunktion bsearch, die mit Arrays jeglichen Datentyps zurechtkommt. Arbeiten Sie dazu mit frei definierbaren int-Funktionen, die sie als Parameter an bsearch übergeben und die von bsearch intern aufgerufen werden. Diese frei definierte Funktion muß -1 zurückliefern, falls der gesuchte Schlüssel kleiner als das Vergleichs­element ist, 0 falls gleich, und +1 falls er größer ist [Lösung].

Interpolationssuche

Hash-Suche

Suche n. Knuth-Morris-Pratt

Suche n. Boyer-Moore

Literatur

  1. Sedgewick R.; Algorithmen; Addison-Wesley; Bonn; 1997; S. 231 ff.
  2. Hermann D.; Algorithmen-Arbeitsbuch; Addison-Wesley; München; 1992; S. 279 ff.
  3. Knuth D.E.; The Art of Computer Programming. Volume 3: Sorting and Searching; Addison-Wesley; Reading, MA; 1975
  4. Ruhland J.; TOOL Informatik: Datenstrukturen und elementare Algorithmen; Vogel; Würzburg; 1991; S. 16 ff.
  5. Glogau R.; DOS International 10/94: DOS-Informatik; DMV; Eschwege; 1994; S. 280 ff.
© 2002, 2003 asdala.de: Kon­takt & Daten­obhut