You are on page 1of 32

ALGORITMOS DE

BUSQUEDA
ESTRUCTURA DE DATOS
Algoritmos de Búsqueda
Definición: Son algoritmos para encontrar un dato dentro de una
estructura o arreglo
- Se ha desarrollado un conjunto de algoritmos de búsqueda que
varían en complejidad, eficiencia y tamaño del dominio de búsqueda.
- Si se conoce por anticipado en qué tipo de “orden” inicial se
encuentran los datos, es posible elegir un algoritmo que sea más
adecuado.

1
Algoritmos de Búsqueda
Los problemas más comunes en la informática son la búsqueda y la
ordenación.

Número de consultas diarias ordenadas en un sitio web?

Por lo tanto, la eficiencia de la búsqueda es importante

La ordenación consiste en ordenar los elementos de un conjunto con el


fin de acelerar la búsqueda.
Tipos de Búsqueda

- Búsqueda Secuencial.

- Búsqueda Binaria.

1
Búsqueda Lineal
Encontrar un elemento determinado dentro de una colección dada.

La búsqueda se realiza sobre una estructura de datos de tamaño fijo y


conocido, por ejemplo, un vector.

Los algoritmos sirven para hacer búsquedas sobre cualquier tipo de


datos, siempre que sea posible realizar comparaciones (‘igualdad’, ‘menor
que’) sobre este tipo.

¿Porqué se llama lineal?


Búsqueda Lineal
Consiste en ir comparando el elemento que se busca con cada elemento
del arreglo hasta que se encuentra.

0 1 2 3 4 5 6 7 8 9

I N F O M Á T I C A

Índice resultado = 5
M M M M M

1
Búsqueda secuencial
Recorrer uno por uno los elementos.
Comparar según sea el criterio.
Se puede querer recuperar el valor o la posición.
Tiene un orden aN
Búsqueda secuencial
int secuencial_search(int numeros[], int valor){

int i=0;
for(i=0;i<N;i++)
if(numeros[i]==valor) return i;
return -1;

}
Búsqueda Lineal
Consiste en recorrer y examinar cada uno de los elementos del array hasta encontrar el o los
elementos buscados, o hasta que se han mirado todos los elementos del array.
Este es el método de búsqueda más lento, pero si nuestra información se encuentra completamente
desordenada es el único que nos podrá ayudar a encontrar el dato que buscamos. El siguiente
algoritmo ilustra un esquema de implementación del algoritmo de búsqueda secuencial:
for(i=0;i<N;i++)
j=0;
if(array[i]==elemento)
{
solucion[j]=i;
j++;
}
Búsqueda lineal (secuencial
Este algoritmo se puede optimizar cuando el array está ordenado, en cuyo caso la condición de
salida cambiaría a:
for(i=j=0;array[i]<=elemento;i++)
o cuando sólo interesa conocer la primera ocurrencia del elemento en el array:
for(i=0;i<N;i++)
if(array[i]==elemento)
break;
Complejidad de la Búsqueda Lineal.
(A) MEJOR CASO: El algoritmo de búsqueda lineal termina tan pronto como encuentra el
elemento buscado en el array. Si tenemos suerte, puede ser que la primera posición examinada
contenga el elemento que buscamos, en cuyo caso el algoritmo informará que tuvo éxito
después de una sola comparación. Por tanto, la complejidad en este caso será O(1).
(B) PEOR CASO: Sucede cuando encontramos X en la última posición del array. Como se
requieren n ejecuciones del bucle mientras, la cantidad de tiempo es proporcional a la longitud
del array n, más un cierto tiempo para realizar las instrucciones del bucle mientras y para la
llamada al método. Por lo tanto, la cantidad de tiempo es de la forma an + b (instrucciones del
mientras * tamaño del arreglo + llamada al método) para ciertas constantes a y b, que
representan el coste del bucle mientras y el costo de llamar el método respectivamente.
Representando esto en notación O, O(an+b) = O(n).
Complejidad de la Búsqueda Lineal.
(C) CASO MEDIO: Supongamos que cada elemento almacenado en el array es igualmente
probable de ser buscado. La media puede calcularse tomando el tiempo total de encontrar
todos los elementos y dividiéndolo por n:
Total = a (1 + 2 + ...+n) + bn = a (n(n+1) / 2) + bn, a representa el costo constante asociado a la
ejecución del ciclo y b el costo constante asociado a la evaluación de la condición. 1, 2 , ..n,
representan el costo de encontrar el elemento en la primera, segunda, ..., enesima posición
dentro del arreglo.
Media = (Total / n) = a((n+1) / 2) + b que es O(n).
Este es el algoritmo de más simple implementación pero no el más efectivo. En el peor de los
casos se recorre el array completo y el valor no se encuentra o se recorre el array completo si
el valor buscado está en la última posición del array. La ventaja es su implementación sencilla
y rápida, la desventaja, su ineficiencia.
Dos de las ventajas de la búsqueda lineal son la simplicidad y la habilidad
de buscar tanto arrays ordenados como desornedados. Su única
desventaja es el tiempo empleado en examinar los elementos.
El número medio de elementos examinados es la mitad de la longitud del
array, y el máximo número de elementos a examinar es la longitud
completa. Por ejemplo, un array uni-dimensional con 20 millones de
elementos requiere que una búsqueda lineal examine una media de 10
millones de elementos y un máximo de 20 millones. Como este tiempo de
examen podría afectar seriamente al rendimiento, utilice la búsqueda
lineal para arrays uni-dimensionales con relativamente pocos elementos.
Búsqueda secuencial
En arreglos bidimensionales el algoritmo es similar.
Se puede hacer por filas o por columnas.
Esta decisión puede afectar el rendimiento
◦ Por lo general, preferir por filas.
Búsqueda secuencial
bidimensional por filas

Algoritmo:

tipo A[filas][columnas]
for (i=0;i<filas;i++)
for (j=0;j<columnas;j++)
if (A[i][j]==elemento)
print(“Encontrado en: A[][] ”,i,j);

1
Búsqueda secuencial
bidimensional por columnas

Algoritmo:

tipo A[filas][columnas]
for (j=0;j<columnas;j++)
for (i=0;i<filas;i++)
if (A[i][j]==elemento)
print(“Encontrado en: A[][]\n”,i,j);

1
https://www.youtube.com/watch?v=X1ozAfTwNP4
BUSQUEDA BINARIA
Búsqueda binaria
Los elementos del arreglo se encuentran ordenados y no están
repetidos. En cada iteración el dominio de búsqueda se divide
en 2.
0 1 2 3 4 5 6 7

5 8 20 32 45 60 73

Resultado = 4
32 32 32

1
Búsqueda binaria
Más rápida
Requiere datos ordenados
No sirve para recuperar la posición original.
“Encierra” el numero búscado “achicando” a la mitad el intervalo que parece contenerlo.
Tiene un orden alog2N
Si los elementos sobre los que se realiza la búsqueda están ordenados, entonces
podemos utilizar un algoritmo de búsqueda mucho más rápido que el secuencial, la
búsqueda binaria. El algoritmo consiste en reducir paulatinamente el ámbito de
búsqueda a la mitad de los elementos, basándose en comparar el elemento a buscar
con el elemento que se encuentra en la mitad del intervalo y en base a esta
comparación:
❑Si el elemento buscado es menor que el elemento medio, entonces sabemos que
el elemento está en la mitad inferior de la tabla.
❑Si es mayor es porque el elemento está en la mitad superior.
❑Si es igual se finaliza con éxito la búsqueda ya que se ha encontrado el elemento.
Se puede aplicar tanto a datos en listas lineales (Vectores, Matrices, etc.) como en
árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda
binaria son:
❑La lista debe estar ordenada en un orden específico de acuerdo al valor de la llave.
❑Debe conocerse el número de registros.
Búsqueda binaria
La búsqueda binaria consiste en dividir el array por su elemento medio en dos
subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden,
la búsqueda se termina. Si el elemento es menor, debe estar (si está) en el
primer subarray, y si es mayor está en el segundo. Por ejemplo, para buscar el
elemento 3 en el array {1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos:
Se toma el elemento central y se divide el array en dos:
{1,2,3,4}-5-{6,7,8,9}
Como el elemento buscado (3) es menor que el central (5), debe estar en el
primer subarray: {1,2,3,4}
Búsqueda binaria
Se vuelve a dividir el array en dos:
{1}-2-{3,4}
Como el elemento buscado es mayor que el central, debe estar en el segundo
subarray: {3,4}
Se vuelve a dividir en dos:
{}-3-{4}
Como el elemento buscado coincide con el central, lo hemos encontrado.
Si al final de la búsqueda todavía no lo hemos encontrado, y el subarray a dividir
está vacio {}, el elemento no se encuentra en el array.
Complejidad de la Búsqueda Binaria.
Para poder medir la velocidad de cálculo del algoritmo de búsqueda binaria, se deberán obtener el número
de comparaciones que realiza el algoritmo, es decir, el número de vueltas del ciclo o el número de
recursiones. Aunque en principio puede parecer que ambas versiones invierten el mismo tiempo, la
recursiva es más lenta a medida que se incrementa considerablemente el número de elementos a considerar,
ya que existirán más llamadas a la función por resolver, con el consiguiente gasto de tiempo y memoria en
guardar y restaurar parámetros.
En el mejor caso, la búsqueda binaria podría toparse con el elemento buscado en el primer punto medio,
requiriéndose sólo una comparación de elementos. Esto equivale al caso óptimo durante una búsqueda
secuencial, pero en el peor de los casos la búsqueda binaria es mucho más rápida cuando N es grande.
El algoritmo de búsqueda binaria progresivamente va disminuyendo el número de elementos sobre el que
realizar la búsqueda a la mitad: n, n/2, n/4, ... Así, tras log (n) divisiones se habrá localizado el elemento o se
tendrá la seguridad de que no estaba. Log (n) divisiones es el numero máximo de veces que se puede reducir
a la mitad la cantidad de registros a considerar, hasta que solo se tenga un elemento.
Versión recursiva de la Búsqueda
Binaria.
Su única novedad es que después de comparar el elemento de búsqueda con el elemento de la
mitad de la tabla, se invoca recursivamente a realizar la búsqueda en uno de los dos posibles
intervalos, el inferior o el superior, finalizando en el momento en el que se encuentre el elemento
o ya se tenga un único elemento y no coincida con el buscado.
Búsqueda Binaria.
La única ventaja de la búsqueda binaria es que reduce el tiempo
empleado en examinar elementos.
El número máximo de elementos a examinar es log2n (donde n es la
longitud del array uni-dimensional). Por ejemplo, un array uni-
dimensional con 1.048.576 elementos requiere que la búsqueda
binaria examine un máximo de 20 elementos.
La búsqueda binaria tiene dos inconveniemtes; el incremento de
complejidad y la necesidad de pre-ordenar el array.
Eficiencia de la búsqueda

¿Cuál de las dos opciones de búsqueda (lineal,


binaria) es más óptimo?
Algoritmo de Búsqueda
Ejercicios:
- Crear un programa que busque un caracter dentro de un
vector.
- Crear un programa que busque el número más pequeño en un
vector.
- Buscar un número seleccionado dentro de un arreglo
ordenado.
- Hacer lo mismo pero con una lista encadenada.

1
EJERCICIO

You might also like