Você está na página 1de 5

Algoritmos de Búsqueda:

Los procesos de búsqueda involucran recorrer un arreglo completo con el fin de


encontrar algo. Lo más común es buscar el menor o mayor elemento (cuando es puede
establecer un orden), o buscar el índice de un elemento determinado.

Existen varias técnicas de búsqueda: búsqueda lineal o secuencial, la técnica más


sencilla, y búsqueda binaria o dicotómica, la técnica más eficiente.

Búsqueda binaria:

La búsqueda binaria proporciona una técnica de búsqueda mejorada. Una búsqueda


binaria típica es la búsqueda de una palabra en un diccionario. Dada la palabra, se abre el
libro cerca del principio, del centro o del final dependiendo de la primera letra del primer
apellido o de la palabra que busca. Se puede tener suerte

Y acertar con la página correcta; pero, normalmente, no será así y se mueve el lector a la
página anterior o posterior del libro. Por ejemplo, si la palabra comienza con «J» y se está
en la «L» se mueve uno hacia atrás. El proceso continúa hasta que se encuentra la
página buscada o hasta que se descubre que la palabra no está en la lista.

Técnica del Método de Búsqueda:


Se aplica en la búsqueda en una lista ordenada. Se sitúa la lectura en el centro de la lista
y se comprueba si la clave coincide con el valor del elemento central. Si no se
encuentra el valor de la clave, se sigue la búsqueda uno en la mitad inferior o superior del
elemento central de la lista. En general, si los datos de la lista están ordenados se puede
utilizar esa información para acortar el tiempo de búsqueda.

Por ejemplo supongamos que tenemos este vector:

int vector[10] = {2,4,6,8,10,12,14,16,18,20};


El algoritmo funciona de la siguen manera:

La clave que queremos buscar es 6. Se determinan un índice arriba y un índice


abajo, Iarriba=0 e Iabajo=9 respectivamente.

1. Se determina un indice central, Icentro = (Iarriba + Iabajo)/2, en este caso


quedaría Icentro = 4.
2. Evaluamos si vector[Icentro] es igual a la clave de busqueda, si es igual ya encontramos
la clave y devolvemos Icentro.
3. Si son distintos, evaluamos si vector[Icentro] es mayor o menos que la clave, como el
arreglo está ordenado al hacer esto ya podemos descartar una mitad del arreglo asegurandonos
que en esa mitad no está la clave que buscamos. En nuestro caso vector[Icentro] = 4 <
6, entonces la parte del arreglo vector[0...4] ya puede descartarse.
4. Reasignamos Iarriba o Iabajo para obtener la nueva parte del arreglo en donde queremos
buscar. Iarriba, queda igual ya que sigue siendo el tope. Iabajo lo tenemos subir hasta 5,
entonces quedaria Iarriba = 9, Iabajo = 5. Y volvemos al paso 2.

Si la clave no fuese encontrada en algun momento Iabajo > Iarriba, con un while vamos
a controlar esta condición para salir del ciclo en tal caso y devolver -1 (clave no encontrada).

Codificación de Método de Búsqueda Binaria:

#include <vector>

bool busqueda_dicotomica(const vector<int> &v, int principio, int


fin, int &x){
bool res;
if(principio <= fin){
int m = ((fin - principio)/2) + principio;
if(x < v[m]) res = busqueda_dicotomica(v, principio, m-1, x);
else if(x > v[m]) res = busqueda_dicotomica(v, m+1, fin, x);
else res = true;
}else res = false;
return res;
}
/*{Post: Si se encuentra devuelve true, sino false}*/

Búsqueda secuencial o lineal:

La búsqueda secuencial busca un elemento de una lista utilizando un valor destino


llamado clave. En una búsqueda secuencial (a veces llamada búsqueda lineal), los
elementos de una lista o vector se exploran (se examinan) en secuencia, uno después de
otro. La búsqueda secuencial es necesaria, por ejemplo, si se desea encontrar la persona
cuyo número de teléfono es 958-220000 en un directorio o listado telefónico de su ciudad.
Los directorios de teléfonos están organizados alfabéticamente por el nombre del
abonado en lugar de por números de teléfono, de modo que deben explorarse todos los
números, uno después de otro, esperando encontrar el número 958-220000. El algoritmo
de búsqueda secuencial compara cada elemento del array con la clave de búsqueda.
Dado que el array no está en un orden prefijado, es probable que el elemento a buscar
pueda ser el primer elemento, el último elemento o cualquier otro. De promedio, al menos
el programa tendrá que comparar la clave de búsqueda con la mitad de los elementos del
array. El método de búsqueda lineal funcionará bien con arrays pequeños o no
ordenados.

Código:

int busquedaSimple(int vector[n], int n, int dato) {

int i;

for(i=0; i<n; i++){


if(dato==vector[i]) {
return i;
break;
}
}
return -1;

Búsqueda por Interpolación.

Descripción de la técnica.

Este método se puede aplicar solamente a tablas o archivos ordenados. Como su nombre
lo indica se trata de llegar al elemento buscado por medio de la interpolación lineal. El
procedimiento es recursivo; como en el caso de la búsqueda binaria, en cada paso se van
modificando los límites, disminuyendo el intervalo, hasta llegar al elemento buscado.

Si se determina que la clave buscada XX se encuentra dentro del intervalo INTABLA de la


tabla, y que la variación en ese intervalo de la clave es INCLAVE, la siguiente posición a
probar es:

PX = PI + ENTERO ((XX-XI) * (INTABLA / INCLAVE))

El algoritmo es similar al de búsqueda binaria, la diferencia está en que en vez de dividir


el área en mitades, se delimita por medio de los valores resultantes de la interpolación.

En búsqueda binaria el espacio se corta siempre adentro a medias, las garantías de lo


que desea el funcionamiento logarítmico. Sin embargo, durante la búsqueda encontramos
un valor que esté muy cerca del número z de la búsqueda, parece más razonable
continuar la búsqueda en esa area envez de ocultor e ir a la media punta siguiente.

En detalle, si z es muy pequeño, debemos comenzar la búsqueda en alguna parte en el


principio de la secuencia en vez de la punta intermedia Considere la manera que abrimos
un libro cuando estamos buscando para cierta página. Diga que la página es 200 y el libro
parece de 800 páginas. La paginación 200 es así alrededor de la marca de un cuarto, y
nosotros utilizamos este conocimiento como indicación de donde abrir el libro. No
golpearemos probablemente la paginación 200 en el primer intento; suponga que
conseguimos la paginación 250 en lugar de otro. Ahora cortamos la búsqueda a un rango
de 250 páginas, y la paginación deseada está en alrededor la marca de 80 por ciento
entre la paginación 1 y 250. Ahora intentamos ir detrás de un quinto de la manera corta.
Podemos continuar este proceso hasta que conseguimos bastante cercanos a la
paginación 200, de que podemos mover de un tirón una página al mismo tiempo. Ésta es
exactamente la idea detrás de la búsqueda de la interpolación. En vez de cortar el espacio
de la búsqueda por una mitad fija, la cortamos por una cantidad que se parezca la más
probable tener éxito.

El funcionamiento de la búsqueda de la interpolación depende no solamente de la talla de


la secuencia, pero también de la entrada de información misma. Hay entradas de
información para los chequeos de la búsqueda de interpolación del deseado en cada
número en la secuencia. Sin embargo, la búsqueda de la interpolación es muy eficiente
para las entradas de información que consisten en elementos relativamente
uniformemente distribuidos (las paginaciones de un libro, por supuesto, se distribuyen
uniformemente). Puede ser mostrado que el número medio de comparaciones se realizó
por la búsqueda de interpolación, donde el promedio asume el control todas las
secuencias posibles, es 0 (logn del registro). Aunque éste se parece ser un orden de la
mejora magnitud concluída del funcionamiento de la búsqueda binaria (debido al logaritmo
adicional).

Codificación.

#define MEDIO (x) ( ((x) + 1)/2 )


#define NO_ ENCONTRADO -1
int bus_bin (int datos [], int tamaño, int clave)
{
int delta,mitad;
delta =tamaño / 2;
while (clave := datos[mitad] ) {
if (delta ==0)
return (NO_ENCONTRADO);
else if(clave>datos[mitad]);
mitad + = medio (delta);
else
mitad -= MEDIO (delta);
delta=delta/2;
}
return (mitad);
}

Você também pode gostar