Está en la página 1de 15

Mtodos de Bsqueda e u Notas de Clase

Prof. Juan Andrs Colmenares, M.Sc. e Instituto de Clculo Aplicado a Facultad de Ingenier a Universidad del Zulia 19 de mayo de 2004

Indice
1. Introduccin o 2. Mtodos Elementales de B squeda e u 2.1. Bsqueda Secuencial . . . . . . . . . . . . . . . . . . . . . . . u 2.2. Bsqueda Binaria . . . . . . . . . . . . . . . . . . . . . . . . . u 2.3. Bsqueda por Interpolacin . . . . . . . . . . . . . . . . . . . u o 3. B squeda por Arbol Binario u 3.1. Operaciones Bsicas . . . . . a 3.1.1. Buscar . . . . . . . . . 3.1.2. Insertar . . . . . . . . 3.1.3. Ordenar . . . . . . . . 3.1.4. Remover . . . . . . . . 3.1.5. Manejo de Duplicados 2 2 2 3 6 7 8 8 8 9 9 10 10 10 12 13 14 15

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

4. Dispersin (Hashing ) o 4.1. Funcin de Dispersin (Hash Function) . . . . . . . . o o 4.2. Resolviendo Colisiones . . . . . . . . . . . . . . . . . . 4.2.1. Encadenamiento Separado (Separate Chaining) 4.2.2. Direccionamiento Abierto (Open Addressing) . 4.3. Factor de Carga y Rehashing . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

1.

Introduccin o

Los algoritmos de bsqueda permiten recuperar uno o varios elementos u particulares de un gran volumen de informacin previamente almacenada o (e.g., buscar un elemento contenido en una lista). La informacin t o picamente est almacenada en registros que contienen una clave y la data. El objetivo a de la operacin de bsqueda es encontrar todos los registros cuya claves o u coincidan con una cierta clave especicada con el propsito de acceder a la o informacin (no slo a la clave ) para su procesamiento. o o Algunos trminos comunes para describir las estructuras de datos relae cionadas con las operaciones de bsqueda son: i) diccionarios y ii) tablas de u s mbolos. En esta unidad estudiaremos mtodos de bsqueda elementales y avane u zados. Como ocurre regulamente, es preferible considerar que los algoritmos de bsqueda pertenecen a conjunto de rutinas empaquetadas que realizan u una serie de rutinas genricas, que se pueden disociar de las implementae ciones particulares, de forma tal de facilitar el pase de una implementacin a o 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 tamao) n

2.
2.1.

Mtodos Elementales de B squeda e u


B squeda Secuencial u

Es un mtodo sumamente simple que resulta util cuando se tiene un cone junto de datos pequeo (hasta aproximadamente 500 elementos). Consiste n en: 1. 2. almacenar todos los registros en un arreglo o lista, 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 bsqueda secuencial (implementadas empleando arreglos) siempre u utiliza N comparaciones para una bsqueda sin xito y alrededor N/2 comu e paraciones (en termino medio) para una bsqueda con xito. u e Lo primero es obvio. Por otra parte, si suponemos que todos los registros tienen la misma probabilidad de ser buscados, el nmero medio de u comparaciones para una bsqueda exitosa es: u 1 + 2 + 3 + + N N +1 = N 2 Propiedad 2 Es fcil adaptar la bsqueda secuencial para que utilice una lista enlazada a u ordenada, lo que hace la bsqueda ms ecaz. Es fcil mantener el orden u a a insertando cada registro en el lugar donde termina una bsqueda sin xito u e y cada bsqueda termina cuando se encuentra un registro con una clave no u menor que la clave de bsqueda. u En este caso, la bsqueda secuencial (en una implementacin basada en u o lista ordenada) utiliza alrededor de N/2 comparaciones (por termino medio) para las bsquedas exitosas o no. u Por otra parte, se puede usar tambin listas desordenadas cuando se ree quiere varias inserciones (en tiempo constante) y bsquedas poco frecuente. u Tambin, si se conoce la frecuencia de acceso de diferentes registros se pueden e obtener mejoras relativas signicativas ordenando los inteligentemente los de acceso ms frecuente al principios. En caso contrario, se puede utilizar la a bsqueda autoorganizada: cada vez que se accede a un registro se le coloca u al principio.

2.2.

B squeda Binaria u

Si el conjunto de registro es grande, el tiempo de bsqueda se puede u reducir utilizando el siguiete algortimo de tipo divide y veceras: 1. 2. 3. se divide el registro en 2 partes se determina la parte debe contener la clave buscada se repite el proceso en esa parte 3

Una forma razonable de dividir el conjunto de registro es mantener los registros ordenados y despus utilizar los e ndices del arreglo ordenado para determinar la parte del arreglo sobre la que se va a trabajar. A continuacin o se presenta una implementacin en Java del mtodo de bsqueda binaria: o e u /** * 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; } }

return -1; } La Figura 1 muestra un ejemplo de bsqueda binaria. u

Figura 1: Ilustracin de la bsqueda binaria. o u

Propiedad 3 La bsqueda binaria nunca utiliza ms de lgN + 1 comparaciones para u a cada bsqueda (con xito o sin l). u e e Ntese que el tamao del arreglo se reduce a la mitad en cada paso, o n enotonces el nmero de comparaciones satisface la frmula de recurrencia u o CN = CN/2 + 1 con C1 = 1. Sin perder generalidad, supongamos que N = 2n , entonces:

C2n

= = = = =

C2n1 + 1 C2n2 + 1 + 1 C2n3 + 1 + 1 + 1 C20 + n 1+n lg(N ) + 1 (1)

C2n

Es claro que el tiempo de insercin de un elemento en el arreglo emo pleado para busqueda binaria es elevado ya que dicho ste debe mantenerse e ordenado. Por ello no debe utilizarse en aplicaciones que involucren muchas inserciones. Por otra parte, es la mejor eleccin en situaciones en que el o arreglo puede construirse una vez al principio (por ejemplo, a travs medie ante MergeSort o QuickSort) y utilizarse despus para un gran nmero de e u bsquedas. u Hasta ahora el mtodo descrito slo devuelve el primer elemento que se e o consiga que contenga la clave de bsqueda, sin embargo con frecuencia no se u 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 bsqueda. En este caso luego de que el mtodo de bsqueda u e u binaria determina la ubicacin del primer elemento se exploran secuencialo 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 estn ordenados entonces elementos con la misma clave deben a estar adyacentes

2.3.

B squeda por Interpolacin u o

Consiste en tratar de acertar en qu parte del intervalo est la clave que e a se esta buscando en lugar de ciegamente dividir el arreglo a la mitad. Para ello se utiliza la siguiente frmula1 : o x = izq + (key-a[izq].key)*(der-izq)/(a[der].key-a[izq].key)
1

Se debe prevenir posible divisin entre cero o

Si aplicamos la bsqueda por interpolacin al ejemplo de la Figura 1 el u o elemento se obtiene en un slo paso ya que: o

x = 0 + (pos(O) pos(A)) (16 0)/(pos(U ) pos(A)) x = 0 + (14 0) (16 0)/(20 0) x = 14 16/20 (2) Propiedad 4 La bsqueda por interpolacin utiliza menos de lglgN +1 comparaciones u o tanto para una bsqueda con xito como para una bsqueda infructuosa en u e u archivos con claves aleatorias. Ntese que este mtodo: o e 1. Depende fuertemente de que las claves estn bien distribuidas en el e intervalo. Esta tcnica puede ser engaada una distribucin no unie n o forme (lo que es frecuente en la prctica). a Los clculos requeridos no merecen la pena si N es pequeo (lgN a n lglgN ). Debe tenerse en cuenta cuando el arreglo es grande y las coparaciones entre claves son costosas. x = 11

2. 3.

3.

B squeda por Arbol Binario u

Es un mtodo simple y ecaz que constituye un algoritmo fundamental e de la informtica. a La propiedad que hace que un rbol binario sea un rbol binario de a a bsqueda es la siguiente: u Sea x un nodo de un rbol binario, entonces los valores de todos los a elementos en su subrbol izquierdo son menores que x y los elementos en el a subrbol derecho son elementos mayores que o iguales a x. a

3.1.

Operaciones Bsicas a

Debido a la naturaleza recursiva de los rboles, es comn que las rutinas a u de un rbol binario de busqueda sean recursivas. A continuacin se describen a o las operaciones bsicas de un rbol de bsqueda binario (considerndolo un a a u a tipo de dato abstracto). 3.1.1. Buscar

Esta operacin retorna el elemento buscado o nulo en caso de que falle o la bsqueda. u Para encontrar un elemento con una clave dada se aplican los siguientes pasos de forma recursiva: 1. 2. 3. 4. Se compara la clave con la ra z. Si es ms pequea se va al subrbol izquierdo. a n a Si es mayor se va al subrbol derecho. a Si es igual se detiene la bsqueda. u

El procedimiento termina cuando se encuentra un nodo con la clave o cuando se procesa un rbol vac (no hay tal clave). a o Cabe destacar la simplicidad del mtodo y que el nmero de llamadas ree u cursivas es relativamente bajo si el rbol se mantienen balanceado (O(lgN )). a 3.1.2. Insertar

Para insertar un nodo en el rbol t a picamente se efecta una bsqueda u u infructuosa de su clave y a continuacin se agrega el nuevo nodo en el lugar o del nodo externo (z null) donde termin la bsqueda. o o u Propiedad 5 El tiempo de ejecucin de las operaciones de bsqueda e insercin deo u o pende mucho de la forma del rbol binario de bsqueda. Una bsqueda o a u u insercin en un rbol binario de bsqueda requiere alrededor de 2lgN como a u paraciones, por termino medio, en un rbol construido a partir de N claves a aleatorias. El mejor caso ocurre cuando el rbol esta balanceado o equilibrado a (O(lgN )). Sin embargo, si las claves no estn ordenadas aleatoriamente el ala goritmo puede tener un mal comportamiento. En el peor caso, una bsqueda u 8

en un rbol binario de bsqueda con N elementos puede necesitar N coma u paraciones. 3.1.3. Ordenar

Para obtener un listado ordenado de los elementos que conforman el rbol binario de bsqueda slo hace falta recorrelo en en orden simtrico, a u o e por lo tanto la ordenacin se obtiene prcticamente de forma gratuita. o a 3.1.4. Remover

Es una operacin que a menudo resulta incmoda. o o En algunas situaciones resulta simple: 1. 2. 3. Eliminar un nodo sin hijos es fcil: se podan haciendo nulo el enlace a con su padre. Si el nodo a eliminar tiene un solo hijo se desplaza el enlace del hijo al enlace del padre. 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, qu hacemos con los nodos ms altos del rbol? Para ello se utiliza e a a la siguiente estrategia general: Se reemplaza el nodo a eliminar con el nodo ms pequeo del subrbol a n a derecho. Este nodo es fcil de encontrar y contiene la clave superior ms a a prxima. Por ser el nodo ms pequeo del subrbol derecho no puede tener o a n a hijo izquierdo, por lo que la manipulacin es una de las descritas anterioro mente. Note que esta solucin puede parecer asimtrica 2 ; en este sentido se o e han sugerido varias modicaciones pero la diferencia no es tan notable para que pueda apreciarse en aplicaciones prcticas. Adicionalmente, se ha dea mostrado que esta estrategia tiende a desequilibrar el rbol (con una altura a media proporcional a N ) si se somete a un gran nmero de operaciones de u insercin y eliminacin. o o Cuando el nmero esperado de eliminaciones es pequeo se usa una tcniu n e ca denominada Lazy Deletion que consiste en unicamente marcar el elemento que se desea eliminar pero ste se deja en el rbol. Si se desea reisertar el e a
Por qu no seleccionar la clave inmediatamente inferior es decir el mayor nodo del e subrbol izquierdo? a
2

elemento eliminado simplemente se desmarca por lo cual se elimina el costo de establecer espacios en memoria. Esta tcnica es de uso frecuente cuando e se manejan elementos con claves repetidas (duplicados) y se lleva la cuenta de la frecuencia de aparicin (simplemente se le resta 1 a la cuenta). o 3.1.5. Manejo de Duplicados

Una forma de manejar elementos repetidos es simplemente no hacer nada especial, sin embargo esto tiende a desbalancear el rbol. Alternativamente a es posible agregar una campo adicional que indique la frecuencia de ocurrencia o utilizar una estructura de datos auxiliar (e.g., lista). Esta ultima altenativa permite que la clave sea parte de una clave mayor.

4.

Dispersin (Hashing ) o

La Tabla de Dispersin (Tabla Hash) es una tabla que almacena pares o (clave, valor). Para ello utiliza un mtodo que permite hacer referencia die rectamente a los registros por medio de transformaciones aritmticas sobre e las claves para obtener direcciones de la tabla. Como tipo de dato abstracto, la tabal de dispersin soporta bsicamente o a las siguientes operaciones: insertar buscar eliminar En promedio el tiempo de ejecucin de estas operaciones es constante. o Gracias a esto y a su simplicidad muchas veces se preere a los rboles a binarios de bsqueda; sin embargo requiere memoria extra. Se considera u que es un buen ejemplo del compromiso entre uso de espacio en memoria y tiempo de ejecucin. o

4.1.

Funcin de Dispersin (Hash Function) o o

Las transformaciones aritmticas se realiza mediante una funcin denome o inada funcin hash (Figuras 2 y 3). Esta funcin debe tener las siguientes o o caracter sticas: 1. Fcil de calcular. a

10

2.

Idealmente deber asegurar que dos claves distintas hacen referencia a a celdas distintas. Ya que esto es imposible, al menos debe distribuir las claves de forma uniforme entre las celdas.

Figura 2: Dominio y recorrido.

Un mtodo bsico para construir funciones de dispersin consiste en: e a o 1. 2. 3. Disponer de un nmero entero grande k que corresponde directamente u a una clave. Selecciona como tamao de la tabla a un nmero primo (M ). n u Para cualquier clave se determina el valor de k y se calcula fh (k) = k %m.

A continuacin se presenta un ejemplo de la implementacin de una o o funcin de dispersin que distribuye de buena manera claves alfanumricas. o o e /** * Implements a hash function for String keys. * * @param key key. * @param tableSize size of the table. * @return hash value. */ public static int hash(String key, int tableSize) 11

Figura 3: Asignacin de celdas. o

{ int hashVal = 0; for (int i = 0; i < key.length(); i++) { hashVal = 37 * hashVal + key.charAt(i); } hashVal %= tableSize; if (hashVal < 0) { hashVal += tableSize; } return hashVal; }

4.2.

Resolviendo Colisiones

Entre los problemas que debe resolver una implementacin est qu hacer o a e cuando dos claves conllevan a un mismo valor (colisin). En esta subseccin o o abordaremos algunas formas de resolver este problema.

12

4.2.1.

Encadenamiento Separado (Separate Chaining )

Simplemente consiste en construir una tabla que contiene una lista en cada celda. Cuando se inserta un elemento en la tabla, ste se pone al nal e de la lista de la celda que le corresponde de acuerdo al valor de la funcin o de dispersin (fh ) utilizada (ver Figura 4). o

Figura 4: Encadenamiento Separado.

Propiedad 6 El encadenamiento separado reduce, en promedio, el nmero de comu paraciones de la bsqueda secuencial en M (tamao de la tabla) y utiliza u n memoria extra de para los M enlaces. Una mejora simple y evidente es mantener las listas ordenadas, sin embargo el benecio que se obtiene no es tan importante pues las listas tienden a ser cortas (de hecho es lo deseable).

13

4.2.2.

Direccionamiento Abierto (Open Addressing )

Si el nmero de elementos a colocar en la tabla de dispersin se puede u o estimar por adelantado, hay suciente espacio de memoria como para almacenar todos los registros (clave-data) y adems se cuenta con espacio de a reserva es mejor no utilizar encadenamiento separado. Esto se debe a que la bsqueda a travs de las listas enlazadas disminuyen el rendimiento del u e algoritmo y son una estructura adicional que agregan complejidad. El direccionamiento abierto se dene como un mtodo para almacenar e N registros en una tabla de tamao M > N , utilizando los lugares vacios de n la tabla para resolver las colisiones.Cuando ocurre una colisin se prueban o celdas alternativas hasta encontrar una celda vac a. Sea la funcin de dispersin fhi = (fh (x) + g(i)) %M y g(i) la estrateo o gia de resolucin de colisiones con g(0) = 0, entonces fh0 , fh1 , fh2 , son o probadas sucesivamente hasta encontrar una celda vac a. Algunas estrategias bsicas para resolver colisiones como parte del mtoa e do de direccionamiento abierto son: exploracin lineal (g(i) = i), exploo racin cuadrtica (g(i) = i2 ) y doble dispersin (double hashing). El o a o principal problema de la exploracin lineal es la formacin de bloques de o o celdas ocupadas, problema conocido como conglomeracin primaria prio mary clustering. Cuando una clave cae de uno de estos bloques se realiza una bsqueda secuencial para resolver la colisin. Para superar este problema se u o ha propuesto la exploracin cuadrtica, sin embargo una mejor solucin es o a o la doble dispersin. o La doble dispersin es una solucin popular y, como su nombre lo o o indica, consiste en resolver las colisiones mediante el clculo de una seguna da funcin de dispersin. Formalmente, la funcin de dispersin es fhi = o o o o (fh (x) + i fh2 (x)) %M donde M es el tamao de la tabla (nmero prin u mo). Ntese que la estrategia de resolucin de colisiones est dada por la o o a expresin g(i) = i fh2 (x) e incluye la funcin de dispersin (fh2 (x)). o o o Una mala seleccin de la funcinfh2 (x) puede ser desastrozo. Por ejempo o lo, esta funcin nunca debe dar como resultado cero, y es importante probar o todas las celdas en caso de que sea necesario. La literatura establece como una funcin apropiada fh2 (x) = R (x %R), donde R es un nmero primo o u menor que el tamao de la tabla (R < M ). n Propiedad 7 La doble dispersin utiliza menos exploraciones por trmino medio que o e la exploracin lineal. o

14

Cuando se emplea el direccionamiento abierto se debe tener precausin o al eliminar un registro de tabla. Ntese que que las ultimas inserciones para o el valor de dispersin pueden estar ms all del registro que se pretende o a a eliminar y el hueco dejado por la eliminacin har que terminen all las o a bsquedas. Entonces en lugar de eliminar (denitivamente) el elemento, ste u e es marcado de forma tal que las bsquedas no lo tomen en cuenta y pueda u ser sustituido en una futura insercin. o

4.3.

Factor de Carga y Rehashing

El fator de carga () se dene como la relacin entre el nmero de elo u ementos almacenados en la tabla de dispersin y su tamao ( = N/M ). o n Es fcil intuir que cuando a 1 el tiempo de ejecucin de las operaciones o se hace lento y las inserciones pueden fallar 3 . Por ejemplo, en el caso de una tabla de dispersin de direccionamiento abierto y exploracin lineal, el o o promedio de exploraciones necesarias: para una bsqueda con xito es: ne1 = 1 (1 + u e 2
1 (1) ) 1 ) (1)2

1 para una bsqueda infructuosa es: ne2 = 2 (1 + u

Ntese que si o 1 ne1 , ne2 . En general, se desea que 0,5 0,7 Con frecuencia (en especial en el caso encademamiento separado) cuando la tabla de dispersin supera el umbral establecido de (e.g. 0.7): o 1. 2. se construye otra tabla aproximadamente el doble de grande (pero siempre su tamao es un numero primo) n se recorre la tabla original y se calcula para cada elemento el valor de la funcin de dispersin para insertarlo en la nueva tabla o o

Obviamente, es una operacin costosa (O(n)),pero que se realiza con o poca frecuencia.

Esto tambin puede ocurrir si existe muchas remociones seguidas de inserciones e

15

También podría gustarte