Diese Ausnahme auf eine binäre Suche sehr ähnlich ist, wenn es um die genauen Schlüssel nicht gefunden wird, wäre es r Einen Schlüssel zu umdrehen wäre sehr nah an dem bereitgestellten Schlüssel.
Die Logik ist so lange zu suchen, bis der exakte Schlüssel gefunden wird oder bis genau ein Schlüssel zwischen High und Low übrig ist, während die Binärsuche durchgeführt wird.
Betrachten wir ein Array n [] = {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
wenn Sie für den Schlüssel suchen: 2, dann unter Algorithmus
Schritt 1: hoch = 10, niedrig = 0, med = 5
Schritt 2: hoch = 5, niedrig = 0, med = 2
Schritt 3: hoch = 2, niedrig = 0, med = 1 In diesem Schritt wird der genaue Schlüssel gefunden. So gibt es 1.
, wenn Sie nach dem Schlüssel suchen: 3 (die in dem Array nicht vorhanden ist), dann unter Verwendung von Algorithmus
Schritt 1: hoch = 10, low = 0, med = 5
Schritt 2: hoch = 5, niedrig = 0, med = 2
Schritt 3: hoch = 2, niedrig = 0, med = 1
Schritt 4: hoch = 1, niedrig = 0, Bei diesem Schritt hoch = niedrig + 1 dh kein Element mehr zu suchen. Also gibt es med = 1 zurück.
Hoffe das hilft ...
public static <T> int binarySearch(List<T> list, T key, Comparator<T> compare) {
int low, high, med, c;
T temp;
high = list.size();
low = 0;
med = (high + low)/2;
while (high != low+1) {
temp = list.get(med);
c = compare.compare(temp, key);
if (c == 0) {
return med;
} else if (c < 0){
low = med;
}else{
high = med;
}
med = (high + low)/2;
}
return med;
}
/** ------------------------ Example -------------------- **/
public static void main(String[] args) {
List<Integer> nos = new ArrayList<Integer>();
nos.addAll(Arrays.asList(new Integer[]{1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}));
search(nos, 2); // Output Search:2 Key:1 Value:2
search(nos, 3); // Output Search:3 Key:1 Value:2
search(nos, 10); // Output Search:10 Key:5 Value:10
search(nos, 11); // Output Search:11 Key:5 Value:10
}
public static void search(List<Integer> nos, int search){
int key = binarySearch(nos, search, new IntComparator());
System.out.println("Search:"+search+"\tKey:"+key+"\tValue:"+nos.get(key));
}
public static class IntComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
return o1.compareTo(o2);
}
}
Gibt es doppelte Werte? Kennen Sie den Wertebereich (d. H. 1
Seth