Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Busquedas PDF
Busquedas PDF
Notas de Clase
Prof. Juan Andres Colmenares, M.Sc.
Instituto de Calculo Aplicado
Facultad de Ingeniera
Universidad del Zulia
19 de mayo de 2004
Indice
1. Introduccion 2
2. Metodos Elementales de B usqueda 2
2.1. B usqueda Secuencial . . . . . . . . . . . . . . . . . . . . . . . 2
2.2. B usqueda Binaria . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.3. B usqueda por Interpolacion . . . . . . . . . . . . . . . . . . . 6
3. B usqueda por
Arbol Binario 7
3.1. Operaciones Basicas . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.1. Buscar . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.2. Insertar . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.1.3. Ordenar . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.4. Remover . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.5. Manejo de Duplicados . . . . . . . . . . . . . . . . . . 10
4. Dispersion (Hashing) 10
4.1. Funcion de Dispersion (Hash Function) . . . . . . . . . . . . 10
4.2. Resolviendo Colisiones . . . . . . . . . . . . . . . . . . . . . . 12
4.2.1. Encadenamiento Separado (Separate Chaining) . . . . 13
4.2.2. Direccionamiento Abierto (Open Addressing) . . . . . 14
4.3. Factor de Carga y Rehashing . . . . . . . . . . . . . . . . . . 15
1
1. Introduccion
Los algoritmos de b usqueda permiten recuperar uno o varios elementos
particulares de un gran volumen de informacion previamente almacenada
(e.g., buscar un elemento contenido en una lista). La informacion tpicamente
esta almacenada en registros que contienen una clave y la data. El objetivo
de la operacion de b usqueda es encontrar todos los registros cuya claves
coincidan con una cierta clave especicada con el proposito de acceder a la
informacion (no solo a la clave ) para su procesamiento.
Algunos terminos comunes para describir las estructuras de datos rela-
cionadas con las operaciones de b usqueda son: i) diccionarios y ii) tablas de
smbolos.
En esta unidad estudiaremos metodos de b usqueda elementales y avan-
zados. Como ocurre regulamente, es preferible considerar que los algoritmos
de b usqueda pertenecen a conjunto de rutinas empaquetadas que realizan
una serie de rutinas genericas, que se pueden disociar de las implementa-
ciones particulares, de forma tal de facilitar el pase de una implementacion a
otra. En consecuencia, se dene un tipo de dato abstracto cuyas operaciones
principales son:
buscar
inicializar
incertar un nuevo registro
eliminar un registro
ordenar (dar como salida todos los registros ordenados)
unir 2 diccionarios en uno solo (de mayor tama no)
2. Metodos Elementales de B usqueda
2.1. B usqueda Secuencial
Es un metodo sumamente simple que resulta util cuando se tiene un con-
junto de datos peque no (hasta aproximadamente 500 elementos). Consiste
en:
1. almacenar todos los registros en un arreglo o lista,
2. insertar cada registro al nal del arreglo o lista, y
2
3. recorrer o iterar sobre el arreglo o lista hasta conseguir el elemento
requerido.
Propiedad 1
La b usqueda secuencial (implementadas empleando arreglos) siempre
utiliza N comparaciones para una b usqueda sin exito y alrededor N/2 com-
paraciones (en termino medio) para una b usqueda con exito.
Lo primero es obvio. Por otra parte, si suponemos que todos los reg-
istros tienen la misma probabilidad de ser buscados, el n umero medio de
comparaciones para una b usqueda exitosa es:
1 + 2 + 3 + +N
N
=
N + 1
2
Propiedad 2
Es facil adaptar la b usqueda secuencial para que utilice una lista enlazada
ordenada, lo que hace la b usqueda mas ecaz. Es facil mantener el orden
insertando cada registro en el lugar donde termina una b usqueda sin exito
y cada b usqueda termina cuando se encuentra un registro con una clave no
menor que la clave de b usqueda.
En este caso, la b usqueda secuencial (en una implementacion basada en
lista ordenada) utiliza alrededor de N/2 comparaciones (por termino medio)
para las b usquedas exitosas o no.
Por otra parte, se puede usar tambien listas desordenadas cuando se re-
quiere varias inserciones (en tiempo constante) y b usquedas poco frecuente.
Tambien, si se conoce la frecuencia de acceso de diferentes registros se pueden
obtener mejoras relativas signicativas ordenando los inteligentemente los
de acceso mas frecuente al principios. En caso contrario, se puede utilizar la
b usqueda autoorganizada: cada vez que se accede a un registro se le coloca
al principio.
2.2. B usqueda Binaria
Si el conjunto de registro es grande, el tiempo de b usqueda se puede
reducir utilizando el siguiete algortimo de tipo divide y veceras:
1. se divide el registro en 2 partes
2. se determina la parte debe contener la clave buscada
3. se repite el proceso en esa parte
3
Una forma razonable de dividir el conjunto de registro es mantener los
registros ordenados y despues utilizar los ndices del arreglo ordenado para
determinar la parte del arreglo sobre la que se va a trabajar. A continuacion
se presenta una implementacion en Java del metodo de b usqueda binaria:
/**
* A simple implementation of binary search.
* @param a array of comparable elements.
* @param key search key.
* @return index of the element found; -1 if it is not found.
*/
public static int binarySearch(Comparable[] a, Comparable key)
{
if (a == null || key == null){
throw new
NullPointerException("a == null || key == null");
}
if (a.length == 0){
return -1;
}
int izq = 0, der = a.length - 1;
int x = 0;
while (der >= izq){
// x = (izq + der)/2;
x = (izq + der) >> 1;
if (a[x].compareTo(key) == 0){
return x;
}
if (a[x].compareTo(key) > 0){
der = x - 1;
}
else{
izq = x + 1;
}
}
4
return -1;
}
La Figura 1 muestra un ejemplo de b usqueda binaria.
Figura 1: Ilustracion de la b usqueda binaria.
Propiedad 3
La b usqueda binaria nunca utiliza mas de lgN + 1 comparaciones para
cada b usqueda (con exito o sin el).
Notese que el tama no del arreglo se reduce a la mitad en cada paso,
enotonces el n umero de comparaciones satisface la formula de recurrencia
C
N
= C
N/2
+ 1 con C
1
= 1.
Sin perder generalidad, supongamos que N = 2
n
, entonces:
5
C
2
n = C
2
n1 + 1
= C
2
n2 + 1 + 1
= C
2
n3 + 1 + 1 + 1
= C
2
0 +n
= 1 +n
C
2
n = lg(N) + 1
(1)
Es claro que el tiempo de insercion de un elemento en el arreglo em-
pleado para busqueda binaria es elevado ya que dicho este debe mantenerse
ordenado. Por ello no debe utilizarse en aplicaciones que involucren muchas
inserciones. Por otra parte, es la mejor eleccion en situaciones en que el
arreglo puede construirse una vez al principio (por ejemplo, a traves medi-
ante MergeSort o QuickSort) y utilizarse despues para un gran n umero de
b usquedas.
Hasta ahora el metodo descrito solo devuelve el primer elemento que se
consiga que contenga la clave de b usqueda, sin embargo con frecuencia no se
puede garantizar que exista un unico elemento con esa clave. Por lo tanto,
en algunas aplicaciones es necesario retornar todos los elementos que tengan
una clave de b usqueda. En este caso luego de que el metodo de b usqueda
binaria determina la ubicacion del primer elemento se exploran secuencial-
mente los elementos a ambos lados del primer elemento hasta conseguir uno
(a cada lado) que no contenga la clave buscada. Puesto que los elementos
en el arreglo estan ordenados entonces elementos con la misma clave deben
estar adyacentes
2.3. B usqueda por Interpolacion
Consiste en tratar de acertar en que parte del intervalo esta la clave que
se esta buscando en lugar de ciegamente dividir el arreglo a la mitad. Para
ello se utiliza la siguiente formula
1
:
x = izq +
(key-a[izq].key)*(der-izq)/(a[der].key-a[izq].key)
1
Se debe prevenir posible division entre cero
6
Si aplicamos la b usqueda por interpolacion al ejemplo de la Figura 1 el
elemento se obtiene en un solo paso ya que:
x = 0 + (pos(O) pos(A)) (16 0)/(pos(U) pos(A))
x = 0 + (14 0) (16 0)/(20 0)
x = 14 16/20
x = 11
(2)
Propiedad 4
La b usqueda por interpolacion utiliza menos de lglgN+1 comparaciones
tanto para una b usqueda con exito como para una b usqueda infructuosa en
archivos con claves aleatorias.
Notese que este metodo:
1. Depende fuertemente de que las claves esten bien distribuidas en el
intervalo. Esta tecnica puede ser enga nada una distribucion no uni-
forme (lo que es frecuente en la practica).
2. Los calculos requeridos no merecen la pena si N es peque no (lgN
lglgN).
3. Debe tenerse en cuenta cuando el arreglo es grande y las coparaciones
entre claves son costosas.
3. B usqueda por
Arbol Binario
Es un metodo simple y ecaz que constituye un algoritmo fundamental
de la informatica.
La propiedad que hace que un arbol binario sea un arbol binario de
b usqueda es la siguiente:
Sea x un nodo de un arbol binario, entonces los valores de todos los
elementos en su subarbol izquierdo son menores que x y los elementos en el
subarbol derecho son elementos mayores que o iguales a x.
7
3.1. Operaciones Basicas
Debido a la naturaleza recursiva de los arboles, es com un que las rutinas
de un arbol binario de busqueda sean recursivas. A continuacion se describen
las operaciones basicas de un arbol de b usqueda binario (considerandolo un
tipo de dato abstracto).
3.1.1. Buscar
Esta operacion retorna el elemento buscado o nulo en caso de que falle
la b usqueda.
Para encontrar un elemento con una clave dada se aplican los siguientes
pasos de forma recursiva:
1. Se compara la clave con la raz.
2. Si es mas peque na se va al subarbol izquierdo.
3. Si es mayor se va al subarbol derecho.
4. Si es igual se detiene la b usqueda.
El procedimiento termina cuando se encuentra un nodo con la clave o
cuando se procesa un arbol vaco (no hay tal clave).
Cabe destacar la simplicidad del metodo y que el n umero de llamadas re-
cursivas es relativamente bajo si el arbol se mantienen balanceado (O(lgN)).
3.1.2. Insertar
Para insertar un nodo en el arbol tpicamente se efect ua una b usqueda
infructuosa de su clave y a continuacion se agrega el nuevo nodo en el lugar
del nodo externo (z o null) donde termino la b usqueda.
Propiedad 5
El tiempo de ejecucion de las operaciones de b usqueda e insercion de-
pende mucho de la forma del arbol binario de b usqueda. Una b usqueda o
insercion en un arbol binario de b usqueda requiere alrededor de 2lgN com-
paraciones, por termino medio, en un arbol construido a partir de N claves
aleatorias.
El mejor caso ocurre cuando el arbol esta balanceado o equilibrado
(O(lgN)). Sin embargo, si las claves no estan ordenadas aleatoriamente el al-
goritmo puede tener un mal comportamiento. En el peor caso, una b usqueda
8
en un arbol binario de b usqueda con N elementos puede necesitar N com-
paraciones.
3.1.3. Ordenar
Para obtener un listado ordenado de los elementos que conforman el
arbol binario de b usqueda solo hace falta recorrelo en en orden simetrico,
por lo tanto la ordenacion se obtiene practicamente de forma gratuita.
3.1.4. Remover
Es una operacion que a menudo resulta incomoda.
En algunas situaciones resulta simple:
1. Eliminar un nodo sin hijos es facil: se podan haciendo nulo el enlace
con su padre.
2. Si el nodo a eliminar tiene un solo hijo se desplaza el enlace del hijo
al enlace del padre.
3. Si el nodo a eliminar tiene dos hijos y uno de sus hijos no tiene hijos,
se utiliza este nodo hijo para reemplazar al padre.
Pero, que hacemos con los nodos mas altos del arbol? Para ello se utiliza
la siguiente estrategia general:
Se reemplaza el nodo a eliminar con el nodo mas peque no del subarbol
derecho. Este nodo es facil de encontrar y contiene la clave superior mas
proxima. Por ser el nodo mas peque no del subarbol derecho no puede tener
hijo izquierdo, por lo que la manipulacion es una de las descritas anterior-
mente.
Note que esta solucion puede parecer asimetrica
2
; en este sentido se
han sugerido varias modicaciones pero la diferencia no es tan notable para
que pueda apreciarse en aplicaciones practicas. Adicionalmente, se ha de-
mostrado que esta estrategia tiende a desequilibrar el arbol (con una altura
media proporcional a