Está en la página 1de 8

Búsqueda

Estática

Algoritmos y
Estructura de
Datos I

1
Búsqueda estática
Gracias a que se dispone de computadoras, se han podido automatizar
muchas tareas que, si tuvieran que realizarse de manera manual, serían muy
tediosas o, más aún, imposibles de realizar en un tiempo finito.

En el ámbito del software, una de las tareas más recurrentes es la que


corresponde a la búsqueda. En la mayoría de los casos, el proceso de
búsqueda se efectúa sobre una estructura ya ordenada, para obtener un
buen rendimiento. Pero, también puede realizarse sobre estructuras
desordenadas. Además, en general, se asume que el elemento que se quiere
encontrar, existe.

La búsqueda dinámica A su vez, existen distintos tipos de procesos de búsqueda, lo cual da por
es aquel proceso de resultado una extensa clasificación. Una forma de clasificación corresponde
búsqueda donde el a la distinción entre búsqueda estática en contraposición a la búsqueda
contenido puede sufrir dinámica.
modificaciones.

En este módulo, se desarrollarán la búsqueda estática y algunas soluciones


o métodos que responden a esta clasificación.

Búsqueda dinámica en oposición a búsqueda estática

La búsqueda dinámica es aquel proceso de búsqueda efectuado sobre una


estructura cuyo contenido puede ser alterado a lo largo del tiempo. Esto
significa que un elemento podría ser modificado o incluso eliminado. Además
también podría tener incorporaciones de nuevos elementos.

La búsqueda estática es aquel proceso de búsqueda efectuado sobre una


estructura cuyo contenido no se altera a lo largo del tiempo, es decir, se
mantienen estáticos, de allí su nombre.

Problema de la búsqueda estática


El autor Sznajdleder define:

Problema de la búsqueda estática. Dado un entero X y una


matriz A, devolver la posición de X en A o una indicación de
que no está presente. Si X aparece más de una vez, devolver

2
cualquiera de las apariciones. La matriz A nunca es
modificada. (Sznajdleder, 2012, p. 204).

Esto implica, también, que no se presentarán inserciones con nuevos


elementos o eliminaciones. Por esto, no será necesario tener en cuenta el
tiempo insumido en ordenar la estructura posterior a la inserción o
eliminación.

Métodos

Algoritmo de búsqueda secuencial

Es un método que consiste en comparar cada elemento de una estructura


con el elemento que se quiere encontrar. Esto supone que no es necesario
tener una estructura ordenada. Es evidente que, al tener que transitar por
todos los elementos, es poco eficiente. Además, este algoritmo puede
terminar en dos estados: con éxito (se encontró el elemento buscado) o sin
éxito (no se localizó el elemento buscado). De todas maneras, la mayoría de
los algoritmos de búsqueda se basan en él.

En el peor de los casos, se tendrá que transitar por todos los elementos,
hasta llegar al último. Por lo tanto, es de orden lineal O(n). Esto sucede tanto
en un caso exitoso (cuando el elemento buscado se encuentra y está en la
última posición), como en un caso sin éxito (cuando no se logra encontrar al
elemento buscado y se tuvo que recorrer a toda la estructura). El mejor de
los casos corresponde a encontrar al elemento buscado en la primera
posición.

En promedio, se podrá obtener un caso con éxito recorriendo la mitad de la


estructura, es decir n/2, por lo que este algoritmo es de orden lineal O(n).

Algoritmo de búsqueda binaria

Este algoritmo parte de una estructura que está ordenada. Es un algoritmo


mucho más eficiente debido a que va subdividiendo la estructura en
mitades, hasta lograr encontrar al elemento buscado o evidenciar que dicho
elemento no se encuentra. Este método está basado en la técnica divide y
vencerás.

El procedimiento del algoritmo es bastante sencillo y consta de los siguientes


pasos, si asumimos que la estructura está ordenada de menor a mayor:

3
1) Se comienza el proceso en el elemento central de la estructura (en caso
de que la cantidad de elementos sea impar) o casi central (en caso de que
la cantidad de elementos sea par). Es decir, se divide a la estructura en
dos mitades.
2) Se verifica si el elemento buscado corresponde al elemento central, en
cuyo caso finaliza el proceso. En caso contrario, se valida si el elemento a
buscar es mayor o menor a dicho elemento. Si el elemento a buscar es de
mayor valor que el elemento central, se descarta la primera mitad. Si el
elemento a buscar es de menor valor que el elemento central, se descarta
la segunda mitad.
3) Con la mitad no descartada, se comienza el proceso de nuevo, desde el
primer paso.

Se repite este proceso de manera sucesiva hasta encontrar al elemento


buscado o hasta que no se pueda subdividir más la estructura, en cuyo caso
se concluye que el elemento buscado no se encuentra.

Programáticamente, este algoritmo se resuelve inicialmente teniendo


referencias a los extremos y el centro de la estructura.

Figura 1: Referencias usadas en la búsqueda binaria en un vector

Fuente: elaboración propia.

Si el elemento que se busca está en el centro de la estructura, se concluye


entregando el valor almacenado en la posición central de esta.

Si el elemento que se busca es mayor que el elemento central, se descarta


la primera mitad y se refrescan las referencias:

 MAX continúa como estaba;


 MIN = MED + 1;
 se calcula el nuevo centro MED = (MAX - MIN) / 2.

4
Figura 2: Vector final, cuando el elemento a buscar es mayor al elemento
central

Fuente: elaboración propia.

Si el elemento que se busca es menor que el elemento central, se descarta


la segunda mitad y se refrescan las referencias:

 MIN continúa como estaba;


 MAX = MED – 1;
 se calcula el nuevo centro MED = (MAX - MIN) / 2.

Figura 3: Vector final cuando el elemento a buscar es menor al elemento


central

Fuente: elaboración propia.

En el mejor de los casos, al iniciar el proceso, el elemento en la posición


central corresponde al elemento buscado. Pero es muy poco probable que
ocurra.

En el peor de los casos, se tienen dos situaciones:

 Se podrá conseguir un estado de éxito y encontrar al elemento buscado


en la última iteración. Se hará, por consiguiente, una cantidad de

5
iteraciones igual a Log(n). La última iteración corresponderá a un rango
de un solo elemento.
 Se podrá conseguir un estado sin éxito, es decir, realizar todas las
iteraciones y detectar que no coinciden con el elemento buscado. Se
harán, por consiguiente, una cantidad de iteraciones igual a Log(n)+1. La
última iteración corresponderá a un rango nulo, es decir, no contendrá
ningún elemento.

En promedio, se obtendrá al elemento buscado con una iteración menos que


el peor caso.

En conclusión, el método responde a un algoritmo de orden O(n*Log(n)). En


presencia de valores de n grandes, este método tiene una eficiencia bastante
mayor que la búsqueda secuencial. Sin embargo, si se tiene una estructura
con una cantidad de elementos n pequeña, este método no es del todo
adecuado. Esto se debe a que, por un lado, es complicado de ser codificado
y, por otro, frente a un n pequeño, se asemejará a un método secuencial.

Por esto, se suelen sugerir estrategias híbridas, donde se aplica el método


binario cuando la estructura tiene una dimensión grande y, luego de obtener
una estructura de menor tamaño, se procede a cambiar de método usando
el algoritmo secuencial.

Búsqueda por interpolación

En la mayoría de los casos, la búsqueda binaria es la primera opción


implementada para la búsqueda de un elemento. Son muy pocos los casos
donde se opta por elegir otro método.

La búsqueda por interpolación es una alternativa cuando se presentan


ciertas situaciones particulares y ofrece, en promedio, un tiempo de
ejecución mejor. Sin embargo, en el peor de los casos, ofrecen un tiempo de
ejecución bastante peor que el de la búsqueda binaria. Por lo tanto, es
importante detectar cuándo es realmente ventajoso aplicar este método.

Los casos donde se recomienda aplicar este algoritmo son:

 Cuando acceder al elemento buscado es muy costoso: el acceso a un


elemento que se encuentra en la memoria es algo muy rápido. Pero,
cuando se debe acceder a un elemento que está almacenado en un disco,
el acceso se vuelve una tarea costosa, que demanda tiempo y recursos.
 Cuando los elementos están ordenados según una distribución uniforme.

6
Evidentemente, resulta complejo encontrar un problema que cumpla con
estas características, para que resulte de utilidad aplicar este algoritmo. Sin
embargo, siempre será necesario conocer los métodos que existen y ser
analíticos ante las situaciones que toquen resolver, para determinar aquel
método que sea más apropiado y eficiente.

Este método se basa en analizar el problema, para realizar una estimación


que permita, desde un principio, determinar dónde está localizado el
elemento que se quiere encontrar. En el método de búsqueda binaria, en
cada iteración, se toma el valor central, mientras que en la búsqueda por
interpolación, se toma de referencia un valor que corresponde a la valuación
de una fórmula mucho más compleja. Si bien el cálculo de este valor
complejiza el proceso y enlentece cada iteración, ocurre que en muchos
casos es insignificante comparado con el costo de tener que acceder a un
elemento.

En el peor de los casos, cuando los elementos de la estructura no responden


a una distribución uniforme, este método puede tener un tiempo de
ejecución lineal. Pero, si se tiene una estructura con distribución uniforme
o, al menos, están distribuidos de una manera bastante uniforme, se puede
obtener un promedio de comparaciones de O(n*Log(Log(n))). Esta expresión
contiene la operación de logaritmo dos veces, una vez más que en la
búsqueda binaria, lo cual permite una reducción de las iteraciones
considerable.

7
Referencias
Sznajdleder, P. A. (2012). Complejidad algorítmica. En D. Fernández (Ed.),
Algoritmos a fondo con implementación en C y JAVA (pp. 522-524). Buenos Aires,
AR: Alfaomega.

Weiss, M. A. (2013). Análisis de algoritmos. En M. Martín-Romo (Ed.), Estructuras


de datos en Java (pp. 204-209). Madrid, ES: Pearson.

También podría gustarte