METODOS DE BUSQUEDA
La recuperación de información es una de las aplicaciones más importantes de las
computadoras. La búsqueda de información está relacionada con las tablas para
consultas. Estas tablas contienen una cantidad de información que se almacenan en
forma de listas de parejas de datos. Por ejemplo un catálogo con una lista de libros de
matemáticas, en donde es necesario buscar con frecuencia elementos en una lista.
La búsqueda es la operación más importante en el procesamiento de información, ya que
permite recuperar datos previamente almacenados. El resultado de una búsqueda puede
ser un éxito, si se encuentra la información o un fracaso, si no la encuentra.
La búsqueda se puede aplicar sobre elementos previamente ordenados o sobre
elementos desordenados, en el primer caso la búsqueda es más fácil, en cambio en el
segundo se dificulta un poco más el proceso, sobre todo cuando de se trata de encontrar
una cantidad de elementos similares.
Los métodos de búsqueda se clasifican en:
Métodos de búsqueda interna
Se denomina búsqueda interna cuando todos los elementos se encuentran en la memoria
principal. Por ejemplo, almacenados en estructuras estáticas (arreglos) o en estructuras
dinámicas (listas ligadas y arboles). El propósito principal de un ordenamiento es el de
facilitar las búsquedas de los miembros del conjunto ordenado.
Métodos de búsqueda externa
Se denomina búsqueda externa cuando todos los elementos se encuentran en memoria
secundaria (archivos almacenados en dispositivos tales como cintas y discos
magnéticos). La búsqueda externa es aquella en la que todos los elementos se
encuentran almacenados en un archivo, el cual se encuentra en un dispositivo de
almacenamiento secundario como un disco duro, una cinta o una memoria USB.
Para que se utilizan los métodos de búsqueda
El propósito principal de un ordenamiento es el de facilitar las búsquedas de los miembros
del conjunto ordenado. Son aquellos en los que los valores a ordenar están en memoria
secundaria (disco, cinta, cilindro magnético, etc.), por lo que se asume que el tiempo que
se requiere para acceder a cualquier elemento depende de la última posición accedida
(posición 1, posición 500, etc.).
6.1 BÚSQUEDA SECUENCIAL
Este tipo de búsqueda consiste en examinar, a partir del primer elemento y de uno en
uno, hasta encontrar el dato buscado o bien llegar al final de la lista que puede estar
almacenada en archivo o arreglo. En este tipo de listas los elementos pueden o no estar
ordenados, ya que se empieza a comparar de uno en uno los elementos de la lista y no
importa su orden o lugar de ubicación para realizar la búsqueda, salvo para el tiempo de
ejecución.
Si el elemento que se está buscando, se encuentra al inicio de la lista, este tiempo, sería
muy corto, pero si se encuentra al final, va a tardar más y si el elemento que se desea
buscar, no se encuentra en la lista, se hizo necesario, recorrer toda la lista, para darse
cuenta que no está en ella. Y si se le aumenta a esto, que el número de elementos en la
lista puede ser del orden de cientos o miles, va a hacer mucho más tardado su ejecución.
Esta búsqueda tiene la ventaja de tener una fácil programación de su algoritmo.
Si el elemento que se está buscando, se encuentra al inicio de la lista, este tiempo, sería
muy corto, pero si se encuentra al final, va a tardar más y si el elemento que se desea
buscar, no se encuentra en la lista, se hizo necesario, recorrer toda la lista, para darse
cuenta que no está en ella. Y si se le aumenta a esto, que el número de elementos en la
lista puede ser del orden de cientos o miles, va a hacer mucho más tardado su ejecución.
Esta búsqueda tiene la ventaja de tener una fácil programación de su algoritmo.
Características
La búsqueda se puede realizar en arreglos desordenados.
El método es totalmente confiable.
El número de comparaciones es significativa si el arreglo es muy grande.
En arreglos desordenados de N componentes puede suceder que el elemento no se
encuentre, por lo tanto se harán N comparaciones al recorrer todo el arreglo
Cantidad mínima de comparaciones es 1.
Cantidad media de comparaciones es (1+N)/2.
Cantidad máxima de comparaciones es N.
Ventajas
Es un método sumamente simple que resulta útil cuando se tiene un conjunto de datos
pequeños (Hasta aproximadamente 500 elementos) Es fácil adaptar la búsqueda
secuencial para que utilice una lista enlazada ordenada, lo que hace la búsqueda más
eficaz. Si los datos buscados no están en orden es el único método que puede emplearse
para hacer dichas búsquedas.
Desventajas
Este método tiende hacer muy lento. Si los valores de la clave no son únicos, para
encontrar todos los elementos con una clave particular, se requiere buscar en todo el
arreglo, lo que hace el proceso muy largo.
6.2 BÚSQUEDA BINARIA
La búsqueda binaria utiliza un método de `divide y vencerás' para localizar el valor
deseado. Con este método se examina primero el elemento central de la lista; si éste es el
elemento buscado, entonces la búsqueda ha terminado.
En caso contrario, se determinar si el elemento buscado será en la primera o la segunda
mitad de la lista y a continuación se repite este proceso, utilizando el elemento central de
esa sub-lista.
La búsqueda binaria es el método, donde si el arreglo o vector está bien ordenado, se
reduce sucesivamente la operación eliminando repetidas veces la mitad de la lista
restante. El proceso comienza comparando el elemento central del arreglo con el
elemento buscado. Si ambos coinciden finaliza la búsqueda. Si no ocurre así, el elemento
buscado será mayor o menor en sentido estricto que el elemento central del arreglo. Si el
elemento buscado es mayor se procede a hacer búsqueda binaria en el sub arreglo
superior, si el elemento buscado es menor que el contenido de la casilla central, se debe
cambiar el segmento a considerar al segmento que está a la izquierda de tal sitio central.
Este método se puede aplicar tanto a datos en listas lineales como en árboles binarios de
búsqueda. Los pre – requisitos para la búsqueda binaria son:
La lista debe estar ordenada, en un orden especifico de acuerdo al valor de la clave.
Debe conocerse el número de elementos.
Si el conjunto de elementos es grande, el tiempo de búsqueda se puede reducir utilizando
el siguiente algoritmo de tipo divide y vencerás:
Se divide el elemento en dos partes.
Se determina la parte que debe contener la clave buscada.
Se repite el proceso en esa parte.
Una forma razonable de dividir el conjunto de elementos es mantener los elementos
ordenados y después utilizar los índices del arreglo ordenado para determinar la parte del
arreglo sobre la que se va a trabajar.
Características
Sirve únicamente para arreglos ordenados.
Es más eficiente que el método de búsqueda secuencial, debido a que el número de
comparaciones se reduce a la mitad por cada iteración del método.
Cantidad mínima de comparaciones es 1.
Cantidad media de comparaciones es (1+log₂(N))/2.
Cantidad máxima de comparaciones es log₂(N).
Ventajas
Se puede aplicar tanto a datos en listas lineales como en árboles binarios de búsqueda.
Es el método más eficiente para encontrar elementos en un arreglo ordenado.
Desventajas
Este método funciona solamente con arreglos ordenados, por lo cual si nos encontramos
con arreglos que no están en orden, este método, no nos ayudaría en nada.
6.3 BÚSQUEDA POR FUNCIONES DE HASH
Es un método de búsqueda que aumenta la velocidad de búsqueda, pero que no requiere
que los elementos estén ordenados. Consiste en asignar a cada elemento un índice
mediante una transformación del elemento. Esta correspondencia se realiza mediante una
función de conversión, llamada función hash. La correspondencia más sencilla es la
identidad, esto es, al número 0 se le asigna el índice 0, al elemento 1 el índice 1, y así
sucesivamente. Pero si los números a almacenar son demasiado grandes esta función es
inservible.
Por ejemplo, se quiere guardar en un array la información de los 1000 usuarios de una
empresa, y se elige el número de DNI como elemento identificativo. Es inviable hacer un
array de 100.000.000 elementos, sobre todo porque se desaprovecha demasiado espacio.
Por eso, se realiza una transformación al número de DNI para que nos dé un número
menor, por ejemplo coger las 3 últimas cifras para guardar a los empleados en un array
de 1000 elementos. Para buscar a uno de ellos, bastaría con realizar la transformación a
su DNI y ver si está o no en el array.
La función de hash ideal debería ser biyectiva, esto es, que a cada elemento le
corresponda un índice, y que a cada índice le corresponda un elemento, pero no siempre
es fácil encontrar esa función, e incluso a veces es inútil, ya que puedes no saber el
número de elementos a almacenar.
La función de hash depende de cada problema y de cada finalidad, y se pueden utilizar
con números o cadenas, pero las más utilizadas son:
Restas sucesivas: esta función se emplea con claves numéricas entre las que existen
huecos de tamaño conocido, obteniéndose direcciones consecutivas.
Aritmética modular: el índice de un número es resto de la división de ese número entre un
número N prefijado, preferentemente primo. Los números se guardarán en las
direcciones de memoria de 0 a N-1. Este método tiene el problema de que cuando hay
N+1 elementos, al menos un índice es señalado por dos elementos (teorema del
palomar). A este fenómeno se le llama colisión, y es tratado más adelante.
Mitad del cuadrado: consiste en elevar al cuadrado la clave y coger las cifras centrales.
Truncamiento: consiste en ignorar parte del número y utilizar los elementos restantes
como índice. También se produce colisión.
Plegamiento: consiste en dividir el número en diferentes partes, y operar con ellas
(normalmente con suma o multiplicación). También se produce colisión.
Ventajas
Una tabla hash tiene como principal ventaja que el acceso a los datos suele ser muy
rápido si se cumplen las siguientes condiciones:
Una razón de ocupación no muy elevada (a partir del 75% de ocupación se producen
demasiadas colisiones y la tabla se vuelve ineficiente).
Una función resumen que distribuya uniformemente las claves. Si la función está mal
diseñada, se producirán muchas colisiones.
Desventajas
Necesidad de ampliar el espacio de la tabla si el volumen de datos almacenados crece.
Se trata de una operación costosa.
Dificultad para recorrer todos los elementos. Se suelen emplear listas para procesar la
totalidad de los elementos.
Desaprovechamiento de la memoria. Si se reserva espacio para todos los posibles
elementos, se consume más memoria de la necesaria; se suele resolver reservando
espacio únicamente para punteros a los elementos.
BLIBLIOGRAFIAS
Alcalde Lancharro, E., & García López, M. I. G. U. E. L. (1992). Metodología de la
programación.
Deitel. P.J. (2008). Como programar en java. Séptima edición. ISBN: 978-970-26-
1190-5. Pearson Educación.
Joyanes. L. (2008). Estructura de datos. Madrid, España: Mc Graw Hill.