Binäre Suche in Java

Binäre Suche in Java
Durch die Suche nach einem Array nach der Position eines Wertes und der Sortierung des Arrays sind zwei verschiedene Prozesse. Suchen bedeutet, zu überprüfen, ob ein Wert, der als Schlüssel bezeichnet wird, im Array gefunden wird. Sortieren bedeutet, alle Werte in das Array in eine bestimmte Reihenfolge zu setzen (aufsteigend oder absteigend). Wenn ein Array nicht sortiert ist und die Suche erforderlich ist, muss das Programm von Index Null und dann in den Index 1, dann in INDEX 2 usw. beginnen, bis es den Index des Werts erreicht, nach dem es sucht. Wenn der Wert mehr als einmal auftritt, sollte der erste Index zurückgegeben werden.

Wenn das Array zuerst sortiert ist, beispielsweise in aufsteigender Reihenfolge, wird die Suche einfach. Der Index ist entweder geringer als der Index für das mittlere Element, wenn der Schlüssel geringer ist als der Wert des mittleren Index oder der Index gleich oder höher als der des mittleren Index, wenn der Wert gleich oder größer ist als der des mittleren Indexwerts.

Teilen Sie also einfach das Array in zwei Teile auf. Wenn der Wert auf der linken Seite liegt, müssen Sie keine Zeit damit verschwenden, die rechte Seite zu durchsuchen. Suchen Sie einfach die linke Seite. Wenn der Wert auf der rechten Seite liegt, müssen Sie keine Zeit damit verschwenden, die linke Seite zu durchsuchen. Suchen Sie einfach die richtige Seite. Da das Array bereits vollständig sortiert ist, wird es bei beiden Seiten wieder in zwei Teile aufgeteilt und nur eines der neuen Seitenpaare durchsucht. In der Tat ist die Suche auf diese Weise nur durch Einspalten in zwei, bis der Wert des Wertes angekommen ist. Es findet keine tatsächliche Suche in Bezug auf das Scannen statt, da das Array bereits sortiert ist. Bei der Suche kann sich ein wenig nach rechts bewegt und leichte sich links im Array links im Array bewegt.

Binär impliziert, zwei. Und so wird diese Art der Suche als binäre Suche bezeichnet. Es gibt verschiedene Sortieraufträge: Alle Werte im Array können in aufsteigender Reihenfolge oder absteigender Reihenfolge vollständig sortiert werden. Ein Array kann auch in das sogenannte Binär -Suchbaum -Format sortiert werden. Dies ist nicht vollständig sortiert in aufsteigender oder absteigender Reihenfolge. Die Binäralgorithmus -Suche funktioniert jedoch immer noch mit diesem Format.

Dieser Artikel erklärt Java Binary Search. Binärer Suchalgorithmus in Java funktioniert in einem bereits sortierten Array. In diesem Artikel wird nur die vollständige Sortierung in aufsteigender Reihenfolge berücksichtigt. Dieser Artikel beginnt mit der Illustration des binären Suchalgorithmus. Anschließend erklären Sie, wie Sie die BinarySearch () -Methoden der Java Arrays -Klasse verwenden können.

Artikelinhalt

  • Illustration des binären Suchalgorithmus
  • Java -Paket und Klasse für binäre Suche
  • Bau des Arrays zur Suche
  • Binäre Suchmethoden der Arrays -Klasse
  • Suchen Sie einen Bereich
  • Abschluss

Illustration des binären Suchalgorithmus

Betrachten Sie die folgende Zeichenfolge:

P v d q s x t h n o

In aufsteigender Reihenfolge wird die Sequenz:

D H n o p q s t v x

Hier gibt es zehn Elemente. Indexzählung beginnt von 0. Wenn die Anzahl der Elemente gleich ist (e.G., 10) Der Index für das mittlere Element wird als die Anzahl der Elemente geteilt durch zwei angesehen. In diesem Fall ist 10/2 5. Wenn die Anzahl der Elemente ungerade ist, wird der Index für das mittlere Element als ganzzahliger Teil (Gesamtzahl) der Anzahl der durch zwei geteilten Elemente angesehen.

Es gibt zwei Listen oben. Die zweite ist die sortierte Form der ersten. Angenommen, die Suche sollte wissen, ob S in der ersten Liste vorhanden war. Die Liste müsste zunächst sortiert werden, um die zweite Liste im Binärsuchschema zu haben. In der sortierten Liste beträgt der Index für die mittlere Position 5 = 10/2. Dies entspricht dem Wert, q. Die Suche hält dann an, um zu überprüfen, ob q s ist, der Wert gesucht hat. Wenn dies der Fall ist, stoppt die Suche. Wenn dies nicht der Fall ist, überprüft die Suchfrequenz, wenn S weniger als Q oder von Q nach oben liegt.

In diesem Fall liegt es im Bereich von q nach oben, was dann ausgewählt wird. Es wird keine Zeit verschwendet, um die untere Hälfte der Liste zu durchsuchen (Array). Dieser neue Sortiment muss also in zwei unterteilt werden. Dieser Bereich besteht aus 5 Elementen. 5/2 = 2 und ein 1/2. Das mittlere Element befindet sich an Position 2 dieses neuen Bereichs. Dies entspricht T, wenn das Zählen von Null von q beginnen soll. Der tatsächliche Index von T ist 7.

Der untere oder linke Bereich besteht jetzt aus (q s), während der neue obere oder rechte Bereich jetzt aus (t v x) besteht. Ist das neue mittlere Element, das das gleiche wie s, der Wert gesucht hat? - NEIN. In welchem ​​Bereich lügen S; Ist es im unteren Bereich (q s) oder im oberen Bereich (t V x)? - Es liegt im unteren Bereich.

Also muss der untere Bereich (q s) in zwei unterteilt werden. In diesem Fall entspricht der mittlere Index für diesen Bereich S (2/2 = 1, da Q bei einem neuen Index 0 ist). Der tatsächliche Index für S beträgt 6 (D befindet sich im ursprünglichen Index 0). Der Index des gefundenen Werts sollte zurückgegeben werden.

Schlüssel nicht gefunden

Der gesuchte Wert wird als Schlüssel bezeichnet. Die sortierte Liste hat tatsächlich zwei Indizieren, wie unten gezeigt:

D H N Ö P Q S T V X
0 1 2 3 4 5 6 7 8 9
-1 -2 -3 -4 -5 -6 -7 -8 -9 -10

Die erste Zeile dieser Tabelle enthält die sortierte Liste. Die zweite Reihe hat die normale Indizierung. Die dritte Zeile hat eine Art negativer Indexierung, bei der sich das erste Element bei Index -1 befindet, das zweite bei Index -2, der dritte bei Index -3 usw.

Wenn der Schlüssel gefunden wird, gibt der Java -Algorithmus den normalen Index ab 0 zurück. Wenn der Schlüssel nicht gefunden wird, gibt der Java -Algorithmus den negativen Index für die Position zurück, die der Schlüssel besetzt hätte (vorausgesetzt, das Array hat sich nach rechts nach einem Element erstreckt).

Java -Paket und Klasse für binäre Suche

Das Java -Binär -Suchschema arbeitet in einem bereits sortierten Array. Die Java -Klasse -Arrays, die sich in der Java befinden.Util.* Paket, verfügt über BinarySearch () -Methoden für binäre Suchen eines bereits sortierten Arrays. Jede dieser Methoden gibt eine Ganzzahl zurück, die ein normaler Index ist, wenn der Schlüssel gefunden wird, oder ein negativer Index, wie oben erläutert, wenn der Schlüssel nicht gefunden wird. Zwei dieser Methoden sind für Zeichen.

Bau des Arrays zur Suche

Die zweite Liste oben wird verwendet, um die Binärsuchcodierung in Java zu veranschaulichen. Die folgende Anweisung kann verwendet werden, um das sortierte Array zu konstruieren:

char [] arr = new char [] 'd', 'h', 'n', 'o', 'p', 'q', 's', 't', 'v', 'x' ;

Das Java -Binär -Suchschema arbeitet in einer bereits sortierten Liste.

Binäre Suchmethoden der Arrays -Klasse

Das obige Anteil von Zeichen wird in diesem Abschnitt zur Illustration verwendet. Die binären Suchmethoden befinden sich in der Arrays -Klasse der Java.Util.* Paket. Dieses Paket muss importiert werden, damit die Arrays -Klasse verwendet wird.

Alle Methoden der Arrays -Klasse sind statische Methoden. Dies bedeutet, dass ein Objekt nicht so instanziiert werden muss, dass eine seiner Methoden verwendet werden. Zwei dieser Methoden sind binäre Suchmethoden für Zeichen. Die Syntax einer der binären Suchmethoden für Chars lautet:

öffentliche statische Int -Binarysearch (Char [] A, Char Key)

Das folgende Programm sucht nach S, die gefunden werden:

Java importieren.Util.*;
öffentliche Klasse Theclass
public static void main (String [] args)
char [] arr = new char [] 'd', 'h', 'n', 'o', 'p', 'q', 's', 't', 'v', 'x' ;
int ret = Arrays.Binarysearch (arr, 's');
System.aus.println (ret);

Die Ausgabe ist 6. Das folgende Codesegment sucht nach B, U und Z, die jeweils nicht gefunden werden.

char [] arr = new char [] 'd', 'h', 'n', 'o', 'p', 'q', 's', 't', 'v', 'x' ;
int ret1 = Arrays.Binarysearch (arr, 'B');
int ret2 = Arrays.Binarysearch (arr, 'u');
int ret3 = Arrays.Binarysearch (arr, 'z');
System.aus.print (ret1); System.aus.print ("); System.aus.print (ret2);
System.aus.print ("); System.aus.print (ret3); System.aus.drucken(");
System.aus.println ();

Die Ausgabe ist,

-1 -9 -11

Suchen Sie einen Bereich

Die Syntax, um eine Reihe von Zeichen zu durchsuchen, lautet:

Öffentliche statische Int -Binarysearch (char [] a, int vonIndex, int toIdex, char Key)

Aus INDEX ist der normale Index, in dem der Bereich beginnt. toIndex ist der normale Index kurz nach dem letzten Element des Bereichs. Das folgende Codesegment durchsucht das sortierte Array, das von Index 3 bis kurz nach Index 7 beginnt, nämlich Index 8. Das Element für Index 8 ist nicht im Bereich enthalten.

char [] arr = new char [] 'd', 'h', 'n', 'o', 'p', 'q', 's', 't', 'v', 'x' ;
int ret = Arrays.Binarysearch (arr, 3, 8, 's');
System.aus.println (ret);

Der Schlüssel ist S und die Ausgabe ist 6.

Abschluss

Die Arrays -Syntaxes zur Suche nach einem Array primitiver Typen sind:

  • öffentliche statische Int -Binarysearch (Byte [] A, Byte Key)
  • Öffentliche statische Int -Binarysearch (Byte [] A, int vonIndex, int toIdex, Byteschlüssel)
  • öffentliche statische Int -Binarysearch (Char [] A, Char Key)
  • Öffentliche statische Int -Binarysearch (char [] a, int vonIndex, int toIdex, char Key)
  • Öffentliche statische Int -Binarysearch (Double [] A, Doppelschlüssel)
  • Öffentliche statische Int -Binarysearch (Double [] A, int vonIndex, int toIdex, Doppelschlüssel)
  • öffentliche statische Int -Binarysearch (Float [] A, Float -Schlüssel)
  • Öffentliche statische Int -Binarysearch (Float [] A, int vonIndex, int toIdex, Float -Schlüssel)
  • Öffentliche statische int -Binarysearch (int [] a, int key)
  • Öffentliche statische Int -Binarysearch (int [] a, int vonIndex, int toIdex, int key)