www.wikidata.de-de.nina.az
Die binare Suche ist ein Algorithmus der in einem Array sehr effizient ein gesuchtes Element entweder findet oder dessen Vorhandensein zuverlassig ausschliesst Voraussetzung ist dass die Elemente in dem Array entsprechend einer totalen Ordnungsrelation angeordnet sortiert sind Der Algorithmus basiert auf einer einfachen Form des Schemas Teile und Herrsche zugleich stellt er auch einen Greedy Algorithmus dar Ordnung und spatere Suche mussen sich auf denselben Schlussel beziehen Beispielsweise kann in einem Telefonbuch das nach Namen geordnet ist mit binarer Suche nur nach einem bestimmten Namen gesucht werden nicht jedoch z B nach einer bestimmten Telefonnummer Inhaltsverzeichnis 1 Algorithmus 2 Beispiel 3 Komplexitat 4 Ahnliche Verfahren und Varianten 4 1 Intervallschachtelung 4 2 Binarer Suchbaum 4 3 Binare Suche und totale Quasiordnung 4 4 Interpolationssuche 4 5 Quadratische Binarsuche 5 Implementierung 6 AnmerkungenAlgorithmus BearbeitenAufgabe In einem sortierten Array soll ein Suchwert gefunden werden Eingabe Das zu durchsuchende Array von links nach rechts mit aufsteigend sortierten Werten gefullt Die gleichen Werte durfen mehrfach vorkommen Der Suchwert Ausgabe Wenn der Suchwert gefunden wurde die Position des Suchwertes im Array Wenn der Suchwert mehrmals im Array vorkommt ist nicht festgelegt welche der moglichen Positionen ausgegeben wird Wenn der Suchwert nicht gefunden wurde ein entsprechender Fehlercode moglicherweise erganzt durch die Position an der der Suchwert stehen wurde Ablauf Der Suchbereich umfasst anfangs das komplette Array Ist der Suchbereich leer wurde der Suchwert nicht gefunden Die Suche ist erfolglos beendet Die Mitte des Suchbereichs wird berechnet und der dort befindliche Wert mit dem Suchwert verglichen Ist der Suchwert gleich dem Vergleichswert ist die Suche erfolgreich beendet Die Position der Mitte wird ausgegeben Ist der Suchwert kleiner als der Vergleichswert kann sich der Suchwert nur in der linken Halfte befinden Der rechte Rand des Suchbereichs wird auf die Position links von der Mitte eingeschrankt Ist der Suchwert grosser als der Vergleichswert kann sich der Suchwert nur in der rechten Halfte befinden Der linke Rand des Suchbereich wird auf die Position rechts von der Mitte eingeschrankt Die Suche wird mit dem verkleinerten Suchbereich ab Schritt 2 wiederholt Bei diesem Ablauf wird die Lange des Suchbereichs in jedem Schritt halbiert Spatestens wenn der Suchbereich auf ein einzelnes Element geschrumpft ist ist die Suche beendet Dieses eine Element ist entweder das gesuchte Element oder das gesuchte Element kommt nicht vor dann ist als Ergebnis bekannt wohin es einsortiert werden musste Der Algorithmus zur binaren Suche kann mittels Iteration oder Rekursion implementiert werden Um ihn verwenden zu konnen mussen die Daten bereits sortiert und in einer Datenstruktur vorliegen in der direkt auf das n te Element zugegriffen werden kann Auf einer einfachen verketteten Liste wurde die Effizienz verloren gehen siehe aber Skip Liste Beispiel Bearbeiten nbsp Gesucht ist das Element mit dem Schlussel G Indizes und Rechnungen in grun ganzzahlige Division Angenommen in nebenstehender alphabetisch sortierter Liste von 13 Buchstaben mochte man wissen ob der Buchstabe G in dieser Liste enthalten ist und an welcher Position er steht oder stehen musste Hierzu pruft man zunachst das mittlere Element der Liste Mittlere Position ist 13 2 6 displaystyle 13 backslash 2 6 nbsp displaystyle backslash nbsp ist Division mit Rest hier Teilen und Abrunden es wird das Element an Position 6 mit dem gesuchten G verglichen Dort findet man den Wert J Da im Alphabet G vor J steht also G kleiner als J ist und die Liste ja sortiert ist muss der Suchwert G im Bereich vor Position 6 stehen Das macht man nun rekursiv Man durchsucht nicht den ganzen verbleibenden Bereich sondern pruft wieder nur das Element in dessen Mitte hier also das Element an der Position 6 2 3 displaystyle 6 backslash 2 3 nbsp Dort steht der Wert F Da G grosser als F ist muss man im Bereich hinter dem F weitersuchen jedoch vor dem J Das heisst man muss im Bereich zwischen Element 3 und Element 6 suchen Nun greift man wieder in die Mitte dieses Bereiches zwischen F und J an Position Position F Position J 2 4 displaystyle textit Position F textit Position J backslash 2 4 nbsp Dort finden wir nun das gesuchte Element G Ware stattdessen der Suchwert I gewesen dann hatten noch der Bereich zwischen G und J gepruft werden mussen Dort ist H kleiner I zwischen H und J verbleibt aber kein Bereich mehr somit ist in dieser Liste kein I enthalten Als Ergebnis kann der Algorithmus nur liefern dass I hinter Position 5 einzusortieren ware Die binare Suche ist effizient Von den insgesamt 13 Buchstaben mussten wir nur 3 Buchstaben vergleichen bis wir den gesuchten Buchstaben G gefunden hatten Auch im schlechtesten Fall hatten wir nur 4 Buchstaben vergleichen mussen Ein naiver Algorithmus wurde hingegen einfach die ganze Liste von vorne nach hinten durchgehen und musste somit im ungunstigsten Fall bis zu 13 Elemente untersuchen wenn der Suchwert Z ware das ganz am Ende der Liste steht oder gar nicht in der Liste enthalten ist Mit binarer Suche kann man also die Anzahl der benotigten Vergleiche stark verringern Dieser Vorteil fallt umso starker ins Gewicht je grosser die zu durchsuchende Liste ist Komplexitat BearbeitenUm in einem Array mit n displaystyle n nbsp Eintragen die An oder Abwesenheit eines Schlussels festzustellen werden maximal log 2 n 1 log 2 n 1 displaystyle lceil log 2 n 1 rceil lfloor log 2 n 1 rfloor nbsp Vergleichsschritte benotigt Somit hat die binare Suche in der Landau Notation ausgedruckt die Zeitkomplexitat O log n displaystyle mathcal O log n nbsp Damit ist sie deutlich schneller als die lineare Suche welche allerdings den Vorteil hat auch in unsortierten Arrays zu funktionieren In Spezialfallen kann die Interpolationssuche schneller sein als die binare Suche Ahnliche Verfahren und Varianten BearbeitenIntervallschachtelung Bearbeiten Hauptartikel Intervallschachtelung Das hier beschriebene binare Suchverfahren kann als eine endliche Auspragung der Intervallschachtelung aus der mathematischen Analysis angesehen werden Binarer Suchbaum Bearbeiten Hauptartikel Binarer Suchbaum Der Such Algorithmus entspricht auch der Suche in einem binaren Suchbaum wenn man das Array als solchen interpretiert das mittlere Element ist die Wurzel die Mitten der so entstehenden Halften die Wurzeln der entsprechenden Teilbaume und so fort Der aus dieser Interpretation resultierende Binarbaum ist sogar ein sog vollstandig balancierter Binarbaum also ein Binarbaum bei dem die Langen der Pfade von den Blattern zur Wurzel sich um hochstens 1 unterscheiden Das gilt auch unabhangig von der Richtung der Rundung bei der Bildung des Mittelwerts der Indizes 1 Der so entstandene Binarbaum ist wie die binare Suche unter allen Binarbaumen mit n displaystyle n nbsp Elementen optimal in Bezug auf die maximale Pfadlange h log 2 n 1 displaystyle h lceil log 2 n 1 rceil nbsp Hohe des Baums die Pfadlangensumme die sich zu 1 n 1 h 2 h displaystyle 1 n 1 h 2 h nbsp ergibt und die mittlere Pfadlange Letztere entspricht der mittleren Anzahl von Vergleichen wenn alle Elemente gleich wahrscheinlich sind Teilt man nicht in der Mitte so ist das Ergebnis immer noch ein binarer Suchbaum jedoch ist er u U nicht balanciert und nicht optimal Die grosse Uberlegenheit des binaren Suchbaums gegenuber der binaren Suche im Array liegt erstens im besseren Verhalten bei Einfugungen und Loschungen bei denen im Mittel ein linearer Aufwand anfallt Bei Baumen gibt es auch in diesen Fallen Implementierungen mit garantiert logarithmischer Laufzeit Dort ist auch die Speicherverwaltung einfacher da Anderungen nicht das ganze Array betreffen sondern sich mit dem Entstehen oder Verschwinden eines Elementes direkt verbinden lassen Zweitens konnen Baume besser als das Array an Haufigkeiten angepasst werden Wenn aber das Array schon fertig sortiert ist und sich dann nicht mehr andert und Zugriffswahrscheinlichkeiten keine Rolle spielen ist das Array ein gutes Verfahren Binare Suche und totale Quasiordnung Bearbeiten Da das Array als endlicher Definitionsbereich einer Funktion angesehen werden kann die naturlich nicht notwendigerweise injektiv sein muss lasst sich das Vorkommen von Duplikaten leicht uber die Funktionswerte regeln Und wenn die Ordnungsrelation von vornherein schon keine Totalordnung sondern nur eine totale Quasiordnung ist ist es ggf sparsamer die Aquivalenzklassen vor dem Vergleichen zu bilden als alle moglichen Duplikate im Array zu halten BeispielIn einer Sammlung von Schlusselwortern soll zwar Gross und Kleinschreibung zulassig sein die Schlusselworter sollen sich aber in ihrer Bedeutung nicht unterscheiden Interpolationssuche Bearbeiten Hauptartikel Interpolationssuche Bei der Interpolationssuche wird das Array nicht mittig geteilt sondern per linearer Interpolation die Position des gesuchten Elementes abgeschatzt Sind die Schlussel in etwa aquidistant verteilt so kann das gesuchte Element in nahezu konstanter Zeit gefunden werden In einem ungunstigen Fall wird die Laufzeit jedoch linear Abgesehen davon muss der Definitionsbereich sich fur eine lineare Interpolation eignen Quadratische Binarsuche Bearbeiten Hauptartikel Quadratische Binarsuche Bei der quadratischen Binarsuche versucht man die Vorteile der Interpolationssuche mit denen der normalen Binarsuche zu kombinieren und mittels Interpolation in jeder Iteration den Suchraum auf ein Intervall der Lange n displaystyle sqrt n nbsp zu verkleinern Implementierung BearbeitenIn zahlreichen Programmiersprachen ist dieser Algorithmus in den Klassenbibliotheken verfugbar In Java gibt es beispielsweise java util Arrays binarySearch in Python das Paket bisect in C STL gibt es std binary search in der algorithms Bibliothek Als Ruckgabewert wird die Arrayposition zuruckgegeben an der der gesuchte Eintrag gefunden wurde Konnte der Eintrag nicht gefunden werden wird meist die Position zuruckgegeben an der er stehen musste von 1 ausgehend ruckwarts gezahlt Bei grossen Arrays kann die Berechnung der Mittenposition mittels links rechts 2 bei der Addition zu einem Uberlauf fuhren daher wird stattdessen links rechts links 2 verwendet Wenn sowohl der linke als auch der rechte Rand des Suchbereichs einschliesslich gelten kann wahrend der Suche die Mittenposition 0 werden und der nachste Wert fur den rechten Rand negativ werden Wurde man hier einen vorzeichenlosen Datentyp verwenden fande ein Unterlauf statt und die Bedingung der Schleife wurde erfullt bleiben Endlosschleife Im folgenden Beispielcode in Python gelten beide Rander des Suchbereichs einschliesslich Die Suchfunktion liefert entweder Position X oder Lucke X je nachdem ob der Suchwert gefunden wurde oder nicht def binare suche folge Sequence int x int gt Tuple str int links 0 rechts len folge 1 while links lt rechts mitte links rechts links 2 Bereich halbieren if folge mitte x return Position mitte if folge mitte gt x rechts mitte 1 im linken Abschnitt weitersuchen else links mitte 1 im rechten Abschnitt weitersuchen return Lucke linksAnmerkungen Bearbeiten Bei einer Belegung des Arrays mit n 2 h 1 displaystyle n 2 h 1 nbsp Eintragen das entspricht einem vollstandigen Binarbaum der Hohe h displaystyle h nbsp haben alle Halbierungen einen Divisionsrest von 0 Abgerufen von https de wikipedia org w index php title Binare Suche amp oldid 239229615