Esto es muy similar a una búsqueda binaria, excepto si no encuentra la clave exacta, sería r una tecla debe estar muy cerca de la clave provista.
La lógica es buscar hasta que se encuentre la clave exacta o hasta que exista exactamente una tecla entre la tecla alta y la baja mientras se realiza la búsqueda binaria.
considerar una matriz n [] = {1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20}
si la búsqueda de la clave: 2, a continuación, mediante el siguiente algoritmo
Paso 1: alto = 10, bajo = 0, med = 5
Paso 2: alto = 5, bajo = 0, med = 2
Paso 3: alto = 2, bajo = 0, med = 1 En este paso se encuentra la clave exacta. Por lo tanto, devuelve 1.
si la búsqueda de la clave: 3 (que no está presente en la matriz), a continuación, mediante el siguiente algoritmo
Paso 1: alta = 10, B = 0, med = 5
Paso 2: alto = 5, bajo = 0, med = 2
Paso 3: alto = 2, bajo = 0, med = 1
Paso 4: alto = 1, bajo = 0, en este paso alto = bajo + 1 es decir, no hay más elementos para buscar. Entonces devuelve med = 1.
Espero que esto ayude ...
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);
}
}
¿Hay valores duplicados? ¿Conoces el rango de valores (es decir, 1
Seth