Verwenden eine Binäre Suche auf einem int-array in absteigender Reihenfolge sortiert
import java.util.*;
import java.io.*;
import java.util.Arrays;
import java.util.Collections;
import org.apache.commons.lang3.ArrayUtils;
@SuppressWarnings("unused")
public class Tester {
public static void main(String args[]){
int i[] = { -7, 15, 21, 22, 43, 49, 51, 67, 81, 84, 89, 95, 97};
ArrayUtils.reverse(i);
System.out.println(binarySearch(i, 22));
System.out.println(binarySearch(i, 89));
System.out.println(binarySearch(i, -100));
System.out.println(binarySearch(i, 72));
System.out.println(binarySearch(i, 102));
}
private static int binarySearch(int a[], int srchVal){
int lb = 0;
int ub = a.length - 1;
while(lb <= ub){
int mid = (lb + ub)/2;
if(a[mid] == srchVal){
return mid;
}
else if(srchVal > a[mid]){
lb = mid + 1;
}
else{
ub = mid - 1;
}
}
return -1;
}
}
Für eine Zuordnung in der Klasse I müssen Sie die Methode binarysearch-Methode, so dass es ordnungsgemäß funktioniert mit dem umgekehrten array. Aber ich kann nicht herausfinden, wie soll ich es ändern.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn das array in absteigender Reihenfolge sortiert, binäre Suche kann noch arbeiten, wenn Sie umkehren der Sinn für den Wert alle Vergleiche durchgeführt, indem die search-Algorithmus.
Den ist-gleich-Fall ist immer noch in Ordnung, aber Sie können umkehren der Vergleich in der
else if
zu einem<
. Dieelse
muss nicht geändert werden, weil dieelse if
änderung bedeutet, dass dieelse
block repräsentiert nun die>
Zustand.Binärer Suche macht die übernahme der Daten ist bestellt. Wenn das der Fall ist, als man weiß, wenn der Wert des ausgewählten index (
mid
) geringer ist als der Wert, der Wert muss im Bereich0..mid-1
- und Umgekehrt.Falls das array sortiert ist in umgekehrter, weiß man, dass wenn der Wert kleiner ist, dann muss man die Suche im zweiten Teil. Das einzige, was Sie ändern müssen, ist die Bedingung, in der
else if
:Sagte, dass man besser lässt die Methode ein bisschen allgemeiner, so kann man den Komparator mehr generische als auch:
In den Fall, Sie bieten eine reversed-array, Sie brauchen nur eine
Comparator<T>
zurückgibt-val
mitval
den Komparator für das original-array.Gibt es einen hack:
1) Reverse ganzen Reihe, so dass es jetzt steigt, um array.
2) binäre Suche und dann finden die passenden index.
3) n-index wird die Antwort sein.
Binäre Suche Arbeit auf sortierte Sätze. Dein code geht davon aus, dass die Reihenfolge aufsteigend, noch ist es das umgekehrte. Als ein Ergebnis, müssen Sie umkehren, Zustand:
Auf Allgemeinen, könnten Sie nicht wissen über die Richtung:
und Verwendung aufsteigender Reihenfolge standardmäßig:
aber absteigende in Ihrem Fall
Nur ändern srchVal > a[mid] - Zustand zu srchVal < a[mid]
Können Sie ein reverse-Komparator in die binäre Suche, wenn Sie möchten, führen Sie die binäre Suche in einem array in absteigender Reihenfolge sortiert.
Beispiel:
Die obige Funktion zurück 4. dies ist der index der 2 in umgekehrter sortierten array.
Es funktioniert auch wie gewohnt, wenn das element nicht im array.
Zum Beispiel, wenn Sie die Suche nach Wert 3, wird es wieder -5. (einfügen-index -1)
Überprüfen Sie diese für details.
Dank