Dieser Artikel teilt mit Ihnen die Variante von Java, die eine binäre Suche nach Referenz implementiert. Der spezifische Inhalt ist wie folgt
Normale binäre Suche:
Überprüfen Sie zunächst die gewöhnliche binäre Suche
Hinweis: Es gibt ein Problem bei der binären Suche: Wenn im Array Duplikationen wie {3, 3, 3, 3} vorhanden sind, ist die Rückgabe arr [1].
Binarysearch im öffentlichen Klassen {public static <t erweitert vergleichbar <? Super t >> int Search (t arr [], t -Wert) {int links = 0; int right = arr.length - 1; while (links <= rechts) {int Mid = (links & rechts) + ((links ^ rechts) >> 1); if (arr [Mid] .Compareto (Wert) == 0) {return Mid; } else if (arr [Mid] .Compareto (Wert)> 0) {rechts = Mid - 1; } else {links = Mid + 1; }} return -1; } public static void main (String [] args) {Integer [] arr = new Integer [] {1, 3, 3, 6, 7, 9}; //-1 System.out.println (Suche (arr, 0)); // 0 System.out.println (Suche (arr, 1)); // 5 System.out.println (Suche (arr, 9)); //-1 System.out.println (Suche (arr, 10)); // 2 System.out.println (Suche (arr, 3)); }}Bipartite Variante: FindFirst -Funktion
Bei normaler binärer Suche in der [linken Seite ...... rechts] links und rechtsgekrönt. Wenn ein Element mit einem Wert gefunden wird, wird es als gefunden. Dies ist in dieser FindFirst -Funktion nicht der Fall. In der [links ...... rechts] link geschlossene rechtsverzichtete Intervall, wenn das Element mit einem Wert gleich Wert gefunden wird, anstelle von rechts = Mitte-1, lass rechts = MID, Suchen Sie weiter in der [linken ...... rechts] link verschlossenen rechtsverzichteten Intervall. Die Schleife verlässt, wenn links == rechts endlich ausgeht.
Nach dem Verlassen der Schleife kann der Wert gefunden werden, oder es kann sein, dass die Schleife den Wert nach dem Durchlaufen des gesamten Arrays nicht findet und die Schleife verlässt.
Nach dem Verlassen der Schleife müssen Sie beurteilen, welche Situation ist.
Binarysearch im öffentlichen Klassen {public static <t erweitert vergleichbar <? Super t >> int findFirst (t arr [], t -Wert) {int links = 0; int right = arr.length - 1; // Beenden Sie bei links> = rechts, die Situation "=" unterscheidet sich hier von binär, während (links <rechts) {int Mid = (links + rechts) >> 1; if (arr [Mid] .Compareto (Wert) <0) {links = Mid + 1; } else {right = Mid; }} // nach der obigen Schleife durchquert. Wurde der Wert gefunden? Es wurde immer noch kein Wert gefunden? Machen einfach ein Urteil. if (arr [links] == value) {return links; } else {return -1; }} public static void main (String [] args) {Integer [] arr = new Integer [] {1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 6, 7, 9}; //-1 system.out.println (findFirst (arr, 0)); // 0 system.out.println (findFirst (arr, 1)); // 12 system.out.println (findFirst (arr, 9)); //-1 system.out.println (findFirst (arr, 10)); // 1 system.out.println (findFirst (arr, 3)); }}Bipartite Variante: Weniger Funktionen
einführen
Finden Sie bei einem Array und einem variablen Wert die Zahl aus dem Array, das dem Wert des Wertes am nächsten ist und kleiner als der Wert ist. Zum Beispiel arr = {11, 22, 22, 33, 33, 33, 44, 54} Wert = 33. 22 ist dem Wert am nächsten und kleiner als der Wert.
Die Antwort ist also 2 (22 in der unteren Eckmarkierung im Array arr).
Wenn keine Anzahl kleiner als Wert gefunden wird, geben Sie -1 aus.
Lösung
Verwenden Sie die binäre Suchmethode. Verwenden Sie jedes Mal arr [Mid], um mit dem Wert zu vergleichen. Klein, gleich, gehen Sie nach links, um danach zu suchen. Groß, gehen Sie nach rechts, um danach zu suchen. Möglicherweise verstehen Sie die "gleiche" Situation im vorherigen Satz nicht. Die gewöhnliche binäre Suche besteht darin, arr [Mid] == Wert zu finden, während die weniger Funktion darin besteht, eine Zahl kleiner als Wert zu finden. Obwohl arr [Mid] == Wert, müssen Sie weiterhin nach einem kleineren Wert auf der linken Seite suchen.
Beispiel
Code
Binarysearch im öffentlichen Klassen {public static <t erweitert vergleichbar <? Super t >> int weniger (t arr [], t -Wert) {int links = 0; int right = arr.length - 1; // beenden Sie, wenn Sie links> rechts (links <= rechts) {int Mid = (links & rechts) + ((links ^ rechts) >> 1); if (value.comPareto (arr [Mid]) <= 0) {right = Mid - 1; } else {links = Mid + 1; }} Return Right; } public static void main (String [] args) {Integer [] arrf = new Integer [] {21, 23, 25, 25, 31, 34, 37, 39, 52, 63}; // 3 system.out.println (weniger (arrf, 30)); }}Bipartite Variante: größere Funktion
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.