Suchverfahren (3)


Unser allgemeines Suchschema läßt sich auch auf ganz andere Datenstrukturen anwenden, sowohl in der rekursiven, wie auch in der iterativen Form.

Als Beispiel betrachten wir eine lineare Tabelle a der Länge max, in der die Daten aufsteigend geordnet  ab 1 bis zu einer Füllhöhe n abgelegt sind. Unsere Teil-Datenstrukturen sind Ausschnitte aus der Tabelle mit den Grenzen l und r, und als Einstieg verwenden wir jeweils die Mitte einer Teiltabelle. Für l>r ist die Teiltabelle leer. Ein Ergebnis wo=0 soll bedeuten: nichts gefunden.

PROCEDURE binsuche(k: keytype; n: CARDINAL; VAR wo: CARDINAL);
VAR Zustand: (suchen, ja, nein);
BEGIN Zustand := suchen;
      WHILE Zustand = suchen
      DO IF l > r THEN wo := 0; Zustand := nein;
         ELSE wo := (l + r) DIV 2;
              IF k = a[wo].key THEN Zustand := ja
              ELSIF k < a[wo].key THEN r := wo - 1
              ELSE (* k > a[wo].key *) l := wo + 1
              END;
         END;
      END;
END binsuche;
Dieses Verfahren nennt man binäre Suche oder auch logarithmische Suche, weil es den Aufwand (log n) hat; so etwa suchen wir auch in einem Telefonbuch.

D.E.Knuth schreibt darüber 1968 in seinem Standardwerk "The Art of Computer Programming" folgendes:

Although the basic idea of binary searching is comparatively straightforward, the details can be somewhat tricky, and many good programmers have done it wrong the first few times they tried.
Mit unserem Ansatz, der den Suchzustand mitrechnet, muß man sich inzwischen wohl eher anstrengen, um Fehler zu machen. Wir vermuten: das liegt daran, daß wir auf einer recht hohen Abstraktionsebene eingestiegen sind, auf der man klar sieht, worauf es ankommt.


zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:36