← ST-Computer 03 / 1992

BinÀrsuche vs. Sekantensuche

Grundlagen

Bislang war das schnellste Such verfahren fĂŒr sortierte Listen die BinĂ€rsuche. Der im folgenden vorgestellte Algorithmus mit der Bezeichnung „Sekantensuche“ weist unter bestimmten Bedingungen ein besseres Zeitverhalten als die BinĂ€rsuche auf.

Die Sekantensuche ist ein Suchverfahren, dessen Algorithmus sich von der Newtonschen Tangentenmethode ableitet. Die Newtonsche Tangentenmethode ist ein NĂ€herungsverfahren der numerischen Mathematik, welche der Nullstellenbestimmung dient. Das NĂ€herungsverfahren wird durch Einsetzen eines x-Wertes in die NĂ€herungsformel (siehe Abb. 1) gestartet. Das Ergebnis dieser Berechnung wird dann wieder in die Formel eingesetzt. Dieser Vorgang wird solange wiederholt, bis die Nullstelle mit ausreichender Genauigkeit angenĂ€hert wurde (Zu beachten ist, daß die Tangentenmethode sich nur unter bestimmten

Voraussetzungen annĂ€hert. Die Konvergenzbedingungen sollen hier allerdings nicht behandelt werden, da die Sekantensuche davon unabhĂ€ngig arbeitet.). Die geometrische Deutung (siehe Abb. 1) der Tangentenmethode ist dabei folgende: Nach Einsetzen des Startwertes (x,) in die Formel wird eine Tangente (t() an die Kurve f(x) im Punkt (x1,f(x1)) gelegt und der Schnittpunkt (x2) der Tangente mit der x-Achse bestimmt. Dieser Schnittpunkt (x2) geht als neuer Startwert in die Formel ein. Durch Wiederholung erhĂ€lt man eine Folge von NĂ€herungen (x-Werten) fĂŒr die Nullstelle.

Bild 1

Herleitung der Sekantensuche

Die Berechnung der Tangente (bei der Newtonschen Tangentenmethode) macht es erforderlich, die Steigung der Funktion f(x) im gewĂŒnschten Punkt (NĂ€herung) zu ermitteln. Dies geschieht durch die Bestimmung der ersten Ableitung (f’(x)) der Funktion f(x) in diesem Punkt.

Um die aufwendige Bestimmung der ersten Ableitung zu vermeiden, kann auch eine Sekante (Gerade durch zwei Punkte der Funktion) an die Funktion gelegt werden. Dies erfordert die Verwendung von jeweils zwei Punkten der Funktion bei jedem NĂ€herungsschritt. Die NĂ€herungsformel lautet dann wie folgt:

xn+1 = (xn-1*yn - xn*yn-1 / (yn - yn-1)

wobei yn=f(xn) ist.

Bild 3

Diese Variante der Tangentenmethode heißt Sekantenmethode und erfordert zwei Startwerte (Die Sekantenmethode weist im Gegensatz zur Tangentenmethode lineare Konvergenz auf, wĂ€hrend die Tangentenmethode quadratisch konvergiert.). Das dargestellte Suchverfahren - die Sekantensuche - leitet sich direkt von dieser Methode ab, enthĂ€lt aber zusĂ€tzliche Elemente (MitfĂŒhrung von Intervallgrenzen, Intervallhalbierung), um die Arbeit mit ganzen Zahlen zu ermöglichen.

Voraussetzungen der Sekantensuche

Damit die Sekantensuche anwendbar ist und schneller als die BinĂ€rsuche arbeitet, sind einige Voraussetzungen zu erfĂŒllen (Die BinĂ€rsuche leitet sich im ĂŒbrigen ebenfalls aus einem Verfahren der numerischen Mathematik ab, welches als Bisektion, Intervallhalbierung oder Intervallschachtelung bekannt ist. Auch dieses Verfahren dient der Nullstellenbestimmung durch ein NĂ€herungsverfahren.):

  1. Das Feld, in dem gesucht wird, muß sortiert sein.
  2. Die Feldelemente mĂŒssen im Bereich der ganze Zahlen liegen und auf dem Rechner darstellbar sein (INTEGER).
  3. Vor dem Suchbeginn mĂŒssen das erste und das letzte bzw. das kleinste und das grĂ¶ĂŸte Element des Feldes bekannt sein.
  4. Die Verteilung der Feldwerte muß möglichst linear oder zumindest glatt sein.

Zu 1.:
Wie die BinĂ€rsuche ist auch die Sekantensuche nur auf sortierte Felder anwendbar. Die Art der Sortierung (aufsteigend oder absteigend) ist im Gegensatz zur BinĂ€rsuche ohne Belang. Das Feld darf gleichgroße Werte enthalten.

Zu 2.:
Die Sekantensuche ist nur in Zahlfeldern anwendbar, da im Unterschied zur BinĂ€rsuche nichtein qualitativer, sondern ein quantitativer Vergleich zwischen Vergleichswert und Suchwert vorgenommen wird. Das heißt, es muß möglich sein, die Differenz zwischen dem zu suchenden Wert und einem Wert des Feldes zu bestimmen.

Zu 3.:
Betrachtet man ein Feld mit Zahlenwerten als die ReprĂ€sentation einer ganzzahligen Funktionsdarstellung - wobei die Funktion aufgrund der Sortierung monoton steigend oder fallend ist -, so sind die Indizes des Feldes als Abschnittswerte der x-Achse und die Feldwerte zu den Indizes als Funktionswerte in Richtung der y-Achse zu sehen (siehe Abb. 2). Der Suchalgorithmus beginnt mit der Bestimmung des Schnittpunktes zwischen einer Parallelen zur x-Achse im Abstand des gesuchten Wertes und einer Geraden durch den ersten und den letzten Feldwert (siehe Abb. 3). Zur Bestimmung dieser Geraden mĂŒssen der erste und der letzte Feldwert bekannt sein und zu Beginn der Suche an die Suchfunktion ĂŒbergeben werden. Genaueres dazu findet sich im Abschnitt „Die Arbeitsweise der Sekantensuche“.

Zu 4.:
Die Suchzeiten der Sekantensuche sind nur gut, wenn die Verteilung der Feldwert linerar oder zumindest glatt ist. Die LinearitĂ€t der Feldwerte bestimmt man, indem man eine Gerade durch den ersten und den letzten Feldwert legt (Das Feld wird hier wieder als ReprĂ€sentant einer Funktionsdarstellung betrachtet). Die Verteilung der Feldwerte ist um so linearer je nĂ€her die Feldwerte an dieser Geraden liegen. (Die Verteilung errechnet sich aus der Summe der absoluten Differenzen zwischen Feldwert und Geradenordinate.) Bei einer nahezu ideal linearen Verteilung (Fast alle Feldwerte liegen auf der Geraden, siehe Abb. 4) werden alle Elemente des Feldes in genau einem Suchschritt gefunden, unabhĂ€ngig von der FeldgrĂ¶ĂŸe. Ist die LinearitĂ€t der Feldwerte schlecht, so sollten die Feldwerte zumindest eine glatte Kurve bilden (Abb. 5) und nicht verstreut liegen (Abb. 6), wenn die Sekantensuche brauchbare Suchzeiten garantieren soll.

Bild 4
Bild 5

Der Algorithmus

Listing 1 zeigt uns zunĂ€chst die iterative Formulierung. Formuliert man den Algorithmus rekursiv, so wird die Suchprozedur einige Zeilen kĂŒrzer. Die zusĂ€tzlichen Prozeduraufrufe (rekursiver Aufruf) können aufgrund der geringen Anzahl der Suchschritte (Aufrufe) vernachlĂ€ssigt werden. In Listing 2 finden wir die rekursive Formulierung. Im Vergleich dazu die BinĂ€rsuche in Listing 3.

Die Bedeutung der Prozedurparameter:

u: Intervalluntergrenze
o: Intervallobergrenze
m: Mitte zwischen oberer und unterer Intervallgrenze (nur bei der BinÀrsuche)
ni: Neuer Index
ai: Alter Index
dx: Differenz der Indizes (x-Koordinaten)
dy: Differenz der Feldwerte (y-Koordinaten) (dx und dy werden nur bei der iterativen Sekantensuche verwendet)
w: Gesuchter Feldwert
f: Feld mit sortierten Werten

Formeln:

ni:=(w-f[ai])*(ni-ai) DIV dy+ai

Diese Formel dient der Bestimmung des neuen Indexwertes aufgrund, einer Sekante die durch die beiden VorgÀnger werte gelegt wurde.

ni:=(o+u) DIV 2

Hier wird eine Intervallhalbierung durchgefĂŒhrt. Der neue Index liegt in der Intervallmitte.

Bild 6

Die Arbeitsweise der Sekantensuche

Im folgenden wird die Arbeitsweise der rekursiven Prozedur beschrieben. Die iterative Variante arbeitet Ă€hnlich. Die Prozedur wird mit sechs Parametern aufgerufen, wobei „u“ und „o“ das Intervall angeben, in dem gesucht werden soll. Die Variablen „ai“ und „ni“ mĂŒssen beim Prozeduraufruf mit den Intervallgrenzen belegt werden; die Reihenfolge ist dabei unerheblich. Der Parameter „dy“ gibt die Differenz zwischen dem grĂ¶ĂŸten (letzten) und dem kleinsten (ersten) SchlĂŒsselwert wieder und der Parameter „w“ enthĂ€lt den zu suchenden Wert. Das Feld „f“, in dem der Wert gesucht wird, sollte global vereinbart sein. Ebenso ist es gĂŒnstig, den Index „ni“ global zu deklarieren, um nach Beendigung der Prozedur feststellen zu können, ob der gesuchte Wert gefunden wurde (f[ni]=w). Da es sich um eine restrekursive Prozedur handelt, ist es ohne weiteres möglich, alle Parameter global zu vereinbaren.

PROCEDURE sekantensuche(ai,dx,dy,w :INTEGER); VAR ni,u,o :INTEGER; BEGIN u:=ai; o:=ai+dx; REPEAT IF dy=0 THEN dy:=1; ni:=(w-f[ai])*(ni-ai) DIV dy +ai; IF (ni>o) OR (ni<u) THEN ni:=(o+u) DIV 2; IF w>f[ni] THEN u:=succ(ni) ELSE o:=pred(ni); dy:=f[ni]-f[ai]; dx:=ni-ai; ai:=ni UNTIL (o>u) OR (f[ni]=w) END;

Listing 1

Beispielaufruf:

  • Werte im Feld f.
  • Indexbereich von 1 bis 1000.
  • Zu suchender Feldwert 100.

Iterative Variante:

sekantensuche (1,1000-1 ,f[1000]-f[1],100), {ai, dx, dy, w}

Rekursive Variante:

sekantensuche(1,1000,1,1000,f[1000]-f[1],100); {u, o, ai, ni, dy, w}

Um den gesuchten Wert zu finden, wird in der Prozedur eine Gerade durch die Feldwerte f[ai] und f[ni] gelegt. Beim ersten Prozeduraufruf sind dies der erste und der letzte Feldwert. Dann wird der Schnittpunkt der Geraden mit einer Parallelen zur x-Achse im Abstand w (gesuchter Wert) bestimmt (siehe Abb. 2) und der Abszissenwert (x-Wert) dieses Schnittpunktes der Variablen „ni“ zugewiesen (Zeile 2). Diese Schnittpunktbestimmung macht es erforderlich, daß der Fall einer waagrechten Geraden (Parallele zur x-Achse, Steigung gleich Null) abgefangen wird (Zeile 1), denn ein Schnittpunkt zwischen zwei Parallelen kann nicht bestimmt werden. Wenn die Differenz der y-Koordinaten von Anfangspunkt und Endpunkt der Geraden Null betrĂ€gt (dy=0, f[ni]=f[ai], das Feld enthĂ€lt gleiche Werte), so wird die Differenz auf den kleinst möglichen Wert (bei ganzen Zahlen ist dies die 1) gesetzt. Die Variable „ni“ enthĂ€lt nach diesem 1. Suchschritt eine erste SchĂ€tzung fĂŒr den Index des gesuchten Feldwertes w. Liegt diese SchĂ€tzung außerhalb der Intervallgrenzen (Vergleich in Zeile 3 des Such Verfahrens), so wird eine Intervallhalbierung durchgefĂŒhrt und der mittlere Wert der Variablen „ni“ zugewiesen (Zeile 4). Sodann wird geprĂŒft (Zeile 5), ob der Feldwert f[ni] zum berechneten Index dem gesuchten Wert entspricht (f[ni]=w) oder ob das Intervall die GrĂ¶ĂŸe Null hat (o>u, obere Intervallgrenze grĂ¶ĂŸer als die untere Intervallgrenze). Ist eine dieser Bedingungen erfĂŒllt, bricht die Suche ab. Im anderen Fall erfolgt ein rekursiver Aufruf (Zeile 7 oder 8), welcher einen weiteren Suchschritt einleitet. Aufgrund der Bedingung w>f[ni] (Zeile 6) wird entschieden, mit welchen Parameterwerten der rekursive Aufruf erfolgt bzw. in welchem Teilintervall ((ni,o] (Zeile 7) oder [u,ni) (Zeile 8)) die Suche fortgesetzt wird. {(a,b] entspricht a>x<=b, [a,b) entspricht a>=x<b}. Durch die MitfĂŒhrung der Intervallgrenzen wird garantiert, daß die Suchschritte konvergieren und das Verfahren bei o>u (bedeutet, daß der Wert nicht im Feld enthalten war) abbricht.

Die Herleitung der Formel (Zeile 2) erfolgt aus der Zweipunkteform der Geradengleichung:

Zweipunkteform: y-y0 = m*(x-x0)

Wobei x=ni, x0=ai und y0 bzw. y die den Indizes zugehörigen Feldwerte sind (y=f[ni], y0=f[ai]). Bestimmt werden soll der Schnittpunkt der Geraden y=m(x-x0)+y0 mit einer Parallelen zur x-Achse im Abstand w (y=w). Durch Gleichsetzung erhÀlt man w=m(x-x0)+y0.

Ermittelt werden soll die Abszisse (Index) des Schnittpunktes. Folglich Auflösen der Gleichung nach x (entspricht dem neuen Index ni).

w-y0 = m(x-x0)

mkann ersetzt werden durch dy/dx, wobei dx die Differenz zweier Indizes und dy die Differenz der zugehörigen SchlĂŒsselwerte darstellen.

w-y0 = dy/dx* (x-x0) (w-y0)*dx/dy = (x-x0) (w-y0)*dx/dy+x0 = x

Ersetzt man die Bezeichnungen und fĂŒhrt wegen der diskreten Werte eine Ganzzahldivision durch, so erhĂ€lt man folgenden Pascalausdruck:

ni:=(w-f[ai])*(ni-ai) DIV dy +ai;

Diese Formel liefert eine AbschĂ€tzung fĂŒr den Index des gesuchten Feldwertes unter Zuhilfenahme einer Sekante, die durch die Feldwerte von zwei vorhergehenden SchĂ€tzungen verlĂ€uft (Beim ersten Aufruf der Prozedur sind dies die Intervallgrenzen). Sind innerhalb dieser zwei vorhergehenden AbschĂ€tzungen die Feldwerte ideal verteilt, so ist der erste gefundene Index der fĂŒr den gesuchten SchlĂŒsselwert, d.h es ist nur ein Suchschritt erforderlich. Da es bei einer entsprechend flachen Sekante Vorkommen kann, daß der neue Index außerhalb des Indexbereiches liegt oder das Verfahren wegen der diskreten Werte nicht konvergiert, wird in der Prozedur ĂŒberprĂŒft (Zeile 3), ob der errechnete Index innerhalb der mitgefĂŒhrten Indexgrenzen (u,o) liegt und eventuell eine Intervallhalbierung durchgefĂŒhrt werden muß (Zeile 4). So kann die Konvergenz des Verfahrens garantiert werden, wobei im schlechtesten Fall „FeldgrĂ¶ĂŸe-2“ Schritte benötigt werden.

PROCEDURE sekantensuche (u, o, ai,ni, dy,w :INTEGER); {Zeile} BEGIN IF dy=0 THEN dy:=1; { 1 } ni:=(w-f[ai])*(ni-ai) DIV dy +ai; { 2 } IF (ni>o) OR (ni<u) { 3 } THEN ni:=(o+u) DIV 2; { 4 } IF (o>u) AND (f[ni]ow) { 5 } THEN IF w>f[ni] { 6 } THEN sekantensuche(ni+l,o,ni,ai,f[ai]-f[ni],w) { 7 } ELSE sekantensuche(u,ni-l,ni,ai,f[ai]-f[ni],w) { 8 } END;

Listing 2

PROCEDURE binaersuche(u,o,w :INTEGER); VAR m :INTEGER; BEGIN REPEAT m:=(u+o) DIV 2; IF w>f[m] THEN u:=succ(m) ELSE o:=pred(m) UNTIL (f[m]=x) OR (u>o) END;

Listing 3

Zwei Ablaufbeispiele

Die folgenden Beispiele beziehen sich auf ein Feld mit den in Bild 7a angegebenen 10 Feldwerten Bild 7 zeigt die graphische Darstellung des Feldes.

Die BinĂ€rsuche benötigt insgesamt 29 Suchschritte, um jeden Wert des Feldes zu finden; die Sekantensuche 25. Sucht man mit der Sekantensuche den ersten oder den letzten Feldwert, so benötigt man hierfĂŒr erwartungsgemĂ€ĂŸ genau einen Suchschritt, da die erste Sekante durch diese beiden Punkte verlĂ€uft und diese Punkte vorab bekannt sein mĂŒssen, um die Sekante zu bestimmen. Jedoch werden auch alle anderen Punkte, die nahe genug an der Geraden liegen, mit einem Suchschritt gefunden, so beispielsweise die Werte 20 und 92.

1. Beispiel: Suche SchlĂŒsselwert 20

  1. Suchschritt:

Berechnung des neuen Indizes „ni“:

ni:=(w-feld[ai])*(ni-ai) DIV dy +ai

Werte eingesetzt:

ni:=(20-feld[1])*(10-1) DIV (93-8) +1 ni:=(20-8)*9 DIV 85 +1 ni:=108 DIV 85 +1 ni:=1 + 1 ni:=2 (errechneter neuer Index) f[ni]=20 ist gleich w=20, folglich wurde der Wert in einem Suchschritt gefunden (siehe Abb. 7).

2. Beispiel (siehe Abb. 8): Suche des SchlĂŒsselwertes 64

  1. Suchschritt:
  • Sekante durch Feldwerte fĂŒr Index 1 und 10
  • Errechneter Index ist 6
  • Zugehöriger Feld wert 79 (zu groß)
  • obere Intervallgrenze wird auf 5 gesetzt
  • rekursiver Aufruf
  1. Suchschritt:
  • Sekante durch Feldweite fĂŒr Index 1 und 6
  • Errechneter Index ist 5 (liegt innerhalb des Intervalles)r
  • Zugehöriger Feldwert 71 (zu groß)
  • obere Intervallgrenze wird auf 4 gesetzt
  • rekursiver Aufruf
  1. Suchschritt:
  • Sekante durch Feldwerte fĂŒr Index 5 und 6
  • Errechneter Index ist 2 (liegt innerhalb des Intervalles)
  • Zugehöriger Feldwert 20 (zu klein)
  • untere Intervallgrenze wird auf 3 gesetzt
  • rekursiver Aufruf
  1. Suchschritt:
  • Sekante durch Feldwerte fĂŒr Index 2 und 5
  • Errechneter Index ist 4 (liegt innerhalb des Intervalles)
  • Zugehöriger Feld wert 64 (Wert gefunden)
  • Prozedurende
Bild 7a
 
Listenindizes: 1 2 3 4 5 6 7 8 9
Feldwerte: 8 20 52 64 71 79 80 91 92
Sekantensuche: 1 1 3 4 3 4 4 3 1
BinÀrsuche: 3 2 3 4 1 3 4 2 3

6 Anzahl der Suchschritte, die die Sekantensuche benötigt, um den angegebenen Feldwert zu finden. 7 Anzahl der Suchschritte, die die BinÀrsuche benötigt. um den angegebenen Feldwert zu finden.

FELDGRÖSSE SUCHZEIT in Sek. SUCHSCHRITTE im Schnitt
Sekanten- BinÀr- Sekanten- Sekanten- BinÀr-
suche suche suche suche suche
5 0.0028 0.0024 1.13 2.00
10 0.0076 0.0050 1.63 2.30
20 0.019 0.013 2.25 3.13
30 0.026 0.019 2.12 3.51
40 0.037 0.027 2.26 3.84
50 0.046 0.039 2.14 4.20
100 0.12 0.092 2.77 5.09
200 0.22 0.21 2.75 5.95
300 0.35 0.32 2.93 6.60
400 0.51 0.43 3.02 6.92
500 0.66 0.61 3.02 7.16
-> 1000 1.5 1.4 3.32 8.22
1500 2.0 2.1 3.51 8.81
2000 2.9 3.1 3.45 9.18
3000 4.2 4.4 3.38 9.82
5000 7.8 8.7 3.55 10.56
7000 10 12 3.50 11.02
10000 17 19 3.75 11.53
15000 24 27 3.77 12.09
20000 35 40 3.89 12.54
30000 51 63 3.81 13.09
40000 67 94 3.93 13.53
50000 90 140 4.13 13.85

Tabelle 2

Bild 9

Die einzelnen Feldwerte der Liste wurden mit folgenden SchÀtzungen gefunden:

Index Feldwert Folge der geschÀtzten Indizes "ni"
1 8 1
2 20 2
3 52 5 4 3
4 64 6 5 2 4
5 71 7 3 5
6 79 8 7 3 6
7 80 8 4 6 7
8 91 9 4 8
9 92 9
10 93 10

Tabelle 1

Wird die Entfernung der Feldwerte zur 1. Sekante groß, so sind mehrere SchĂ€tzungen (Sekantenberechnungen, Suchschritte) notwendig, um den Index zu finden. Die Anzahl der notwendigen Suchschritte wĂ€chst mit zunehmender Differenz (Sekante-Feldwert) an.

BinÀrsuche kontra Sekantensuche

Vergleicht man die BinĂ€rsuche mit der Sekantensuche, so erkennt man, daß ein Suchschritt der Sekantensuche rund doppelt so lange dauert wie ein Schritt der BinĂ€rsuche. Diesen Vorsprung der BinĂ€rsuche kann die Sekantensuche erst bei Feldern mit mehr als 1000 Elementen einholen. Findet die Suche allerdings nicht im Hauptspeicher sondern auf einem externen Speichermedium (Platte) statt, so sind noch die Blocktransferzeiten zu berĂŒcksichtigen. Hier sollte die Sekantensuche vorteilhaft arbeiten, da der erste Suchschritt zumeist schon im richtigen Block liegt und die Transferzeiten damit klein bleiben. Die BinĂ€rsuche sollte hier schlechter abschneiden, da die Suchschritte verstreuter liegen. Zudem ĂŒberwiegen dann die Blocktransferzeiten die Suchschrittdauer im Hauptspeicher bei weitem, so daß sich die Gesamtzeiten fĂŒr einen Suchschritt der Sekantensuche an die Zeiten der BinĂ€rsuche annĂ€hem. Da die Sekantensuche im Schnitt aber weniger Suchschritte benötigt, mĂŒĂŸte sie schon bei kleineren FeldgrĂ¶ĂŸen schneller als die BinĂ€rsuche werden. Das Zeitverhalten der Sekantensuche auf externen Speichermedien wurde allerdings bislang nicht getestet.Die folgende Tabelle gibt einen Vergleich zwischen BinĂ€rsuche und Sekantensuche wieder:

Zur Tabelle 2: Das Feld f[1..n] enthielt jeweils eine Folge von Zufallswerten im Bereich von 1-n. Sortiert wurde mit dem Sortieralgorithmus Quicksort. Alle Messung wurden auf einem Mega ST 2 mit ST PASCAL+ durchgefĂŒhrt. Die Werte fĂŒr die Suchzeiten und die Suchschritte wurden aus dem Mittel von jeweils drei Messungen gebildet. Die Suchzeiten geben an, wieviel Zeit benötigt wurde, um jedes Element des Feldes zu finden (also die Summe der einzelnen Suchzeiten). Die Anzahl der durchschnittlichen Suchschritte errechnet sich aus der Summe der Suchschritte zum Auffinden jedes Feldelementes dividiert durch die FeldgrĂ¶ĂŸe n. Wie zu sehen ist, steigt diese Zahl bei der Sekantensuche mit zunehmender FeldgrĂ¶ĂŸe an, wenn auch langsamer als bei der BinĂ€rsuche. Dies liegt an der zunehmenden Verschlechterung der Verteilung der Feldwerte mit steigender ListengrĂ¶ĂŸe. Trotzdem beginnt sich der Einsatz der Sekantensuche bei Feldern mit mehr als 1000 Elementen zu lohnen.

Der folgende Graph (Abb. 9) zeigt die Anzahl der durchschnittlichen Suchschritte in AbhĂ€ngigkeit von der FeldgrĂ¶ĂŸe. Die BinĂ€rsuche stellt sich hier erwartungsgemĂ€ĂŸ (da Intervallhalbierung gilt : Suchschrittemax= log2n+1 ) als logarithmische Kurve dar. Die Basis des dargestellten Logarithmus liegt aufgrund der Durchschnittsbildung etwas höher (die Kurve wird flacher) als 2, nĂ€mlich ca. bei 2.19.

Auch die Kurve der Sekantensuche zeigt sich bei dieser Verteilung (nicht ideal) als logarithmische Kurve mit einer Basis von ca. 15.65. Sind die Feld werte jedoch ideal verteilt, so bildet die Sekantensuche eine Parallele zur x-Achse im Abstand 1 (ein Suchschritt). Je besser die Verteilung ist, um so mehr nĂ€hert sich die logarithmische Kurve der Geraden an. TrĂ€gt man die Suchzeit in AbhĂ€ngigkeit von der FeldgrĂ¶ĂŸe an (Abb. 10), so erkennt man, daß die Sekanntensuche mit zunehmender FeldgrĂ¶ĂŸe immer mehr Zeit im Vergleich zur BinĂ€rsuche einspart. Ist die Verteilung der Feldwert ideal, so wird jedes Element des Feldes in genau einem Suchschritt gefunden. Daraus folgt eine konstante Suchzeit, die sich in der Parallelen zur x-Achse im Abstand der Zeit fĂŒr einen Suchschritt (ca. 0.44 ms) widerspiegelt. Ein Suchschritt der BinĂ€rsuche dauert ca. 0.22 ms. Es ergeben sich Geraden, weil nicht die durchschnittliche Suchzeit, sondern die Gesamtsuchzeit angetragen wurde.

Bild 10

Anwendungsbereiche der Sekantensuche

Die Anwendungen der Sekantensuche sind aufgrund der oben genannten Restriktionen auf Zahlenfelder beschrĂ€nkt. Auch lohnt sich der Einsatz erst bei großen bis sehr großen Feldern. Wenn allerdings auf externen Speichermedien gesucht wird, können auch kleinere Felder schon vorteilhaftbearbeitet werden. Weiterhin sollten die Zahlenwerte der Felder eine gute Verteilung aufweisen; dies ist zumeist bei fortlaufenden Zahlenlisten wie Teilenummern, Rechnungsnummern, Statistiken usw. der Fall. Ist dies nicht der Fall, so nĂ€hert sich die Suchschrittzahl der Sekantensuche der BinĂ€rsuche. Zu beachten ist, daß aufgrund der Sekantenberechnung der Bereich der vom Rechner verarbeitbaren Zahlen eingehalten werden muß. Negativ wirkt sich hier die Multiplikation in der Formel zur Indexberechnung aus, welche bewirkt, daß folgende Bedingung gelten muß:

FeldgrĂ¶ĂŸe n * grĂ¶ĂŸter Feldwert -1 <= grĂ¶ĂŸte ganze Zahl

Daraus folgt, daß es sich empfiehlt Long-Integers zur Berechnung zu verwenden.

Fazit

  • Die Sekantensuche ist nicht so allgemein einsetzbar wie die BinĂ€rsuche (Zahlenfelder, Verteilung der Feldwerte).
  • Die maximal verarbeitbaren ListenlĂ€ngen sind bei der Sekantensuche kleiner als bei der BinĂ€rsuche.
  • Die Suchzeiten der Sekantensuche hĂ€ngen zwar weniger von der FeldgrĂ¶ĂŸe, dafĂŒr aber mehr von den Feldwerten ab.
  • Die Sekantensuche ist vorrangig fĂŒr die Suche auf externen Speichermedien geeignet.
  • Wenn die Verteilung der Feldwerte gut ist, ist die Sekantensuche ein sehr gutes Suchverfahren.

Literatur:

Bartsch, Hans-Jochen : Taschenbuch mathematischer Formeln; Verlag Harri Deutsch, Frankfurt 1986

Wirth, Niklaus : Algorithmen und Datenstrukturen; Teubner, Stuttgart 1983

Wollschlaeger, Peter: ATARI-ST-Programmierpraxis ST PASCAL; Markt-und-Technik-Verlag, Haar bei MĂŒnchen 1987

Stefan Maetschke