Contenidos Estructuras de Datos y Algoritmos 1 • Búsqueda lineal • Búsqueda binaria • Búsqueda por hash Tema 8. Algoritmos de búsqueda Iván Cantador José R. Dorronsoro Escuela Politécnica Superior Universidad Autónoma de Madrid Contenidos Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 2 Búsqueda lineal 3 • Búsqueda lineal • Busca un dato (clave) K en una tabla T • No impone restricciones sobre la tabla T • Tiene complejidad lineal: O(N) • Búsqueda lineal • Búsqueda binaria • Búsqueda por hash indice BusquedaLineal(tabla T, indice P, indice U, clave K) { i = P; mientras i <= U: si K == T[i]: return i; i++; return ERROR; } Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda lineal 4 Contenidos 5 • Búsqueda lineal - ejemplo • T= 4 • K=3 7 1 5 8 9 2 3 6 P U 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 4 7 1 5 8 9 2 3 6 • Búsqueda lineal • Búsqueda binaria • Búsqueda por hash 8 comparaciones de clave Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda binaria Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 6 • Búsqueda binaria • Busca un dato (clave) K en una tabla T • Requiere que la tabla T esté ordenada • Tiene rendimiento logarítmico: O(log N) indice BusquedaBinaria(tabla T, indice P, indice U, clave K) { mientras P <= U: M = (P + U) / 2; si K == T[M]: return M; else si K < T[M]: U = M - 1; else: P = M + 1; return ERROR; } Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda binaria 7 • Búsqueda binaria - ejemplo • T= 1 • K=3 2 3 4 5 6 7 P 8 9 M 1 2 P M 1 2 3 4 5 U 6 7 8 9 U 3 4 P=M U 3 4 3 comparaciones de clave Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Ordenación & búsqueda 8 Contenidos 9 • Complejidad de algoritmos de ordenación y búsqueda • ¿Existe algoritmo de búsqueda a tiempo constante? - ¡Sí! ¡Búsqueda por hash! Algoritmos de ordenación Algoritmos de búsqueda Algoritmos locales BubbleSort SelectSort InsertSort Algoritmos D&V MergeSort QuickSort RadixSort O(N2) O(N log N) O(N) Búsqueda lineal Búsqueda binaria O(N) O(log N) • Búsqueda lineal • Búsqueda binaria • Búsqueda por hash O(1) Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda por hash Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 10 Búsqueda por hash 11 • Escenario • Todo dato D∈D tiene asignado una clave K(D)∈K • K(D) determina la búsqueda de datos: - buscar D en una tabla T buscar D en la posición K(D) de T • Objetivo • Búsqueda a tiempo constante: O(1), independiente de N • Escenario • Todo dato D∈D tiene asignado una clave K(D)∈K • K(D) determina la búsqueda de datos: - buscar D en una tabla T buscar D en la posición K(D) de T indice BusquedaPorClave(tabla T, dato D) { si T[K(D)] == NULL devolver NULL else T devolver K(D) T 0 K(D) = 1 K(D) K(D) = 1 1 2 D 0 K(D) D 3 D no está en T 4 5 Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 1 2 3 D está en T 4 5 D Búsqueda por hash 12 • Problema: alto coste de memoria – ejemplo Búsqueda por hash 13 • Problema: alto coste de memoria – solución • Colegio de primaria con 240 alumnos • Cada alumno tiene asignado un número de identificación de 6 dígitos • El número de identificación es usado como clave de un alumno y referencia la dirección de un registro en memoria • Coste de la búsqueda de alumnos - En tiempo: 0 comparaciones, pues las claves proporcionan directamente los registros donde está (o no está) almacenada la información de los alumnos - En espacio: ¡¡¡106 registros!!! Y sólo hay 240 alumnos… • En general, el espacio de claves es muy grande: • Se fija el tamaño de la tabla M ≈ |D| • Se define una función inyectiva, llamada función hash, de la forma: H: {K(D): D∈D} {1, …, M} • Al crear la tabla T un dato D ∈D se inserta en la posición T[H(K(D))] • La función de búsqueda de un dato D∈D se define como sigue: indice BusquedaPorHash(tabla T, dato D) { si T[H(K(D))] == NULL devolver NULL else devolver H(K(D)) |D| << |K| Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda por hash • Problema: definir la función hash inyectiva • Solución 1: definir la función "a mano" - Fijar explícitamente los valores H(K(D)) ∀D∈D - No es viable: en general |D| es grande y puede aumentar • Solución 2: usar una función "estadísticamente" inyectiva - H será inyectiva casi siempre - Será raro que haya D, D’∈D tales que D≠D’, H(K(D))=H(K(D’)) - Los casos en los que D≠D’, H(K(D))=H(K(D’)) se llamarán colisiones Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 14 Búsqueda por hash • Problema: definir la función hash cuasi-inyectiva • Solución 1: función que dé valores aleatorios en [1, M] - No es válida: es cierto que con ella sería raro que hubiese D, D’∈D tales que D≠D’, H(K(D))=H(K(D’)), pero sería aún más raro que dado D∈D la llamada H(K(D)) siempre diera el mismo valor • Solución 2: función de comportamiento cuasi aleatorio: - Proporciona valores en apariencia aleatorios - Es consistente frente argumentos: siempre da el mismo valor para el mismo argumento Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 15 Búsqueda por hash 16 1. Método de multiplicación - Se fija un tamaño de tabla M y un número irracional A∈[0,1] ∈ - La función hash H para una clave k se define así: H(K(D)) = H(k) = ⌊k · M · A⌋ - Elecciones habituales: Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid 18 • Problema: resolver colisiones indice BusquedaPorHash(tabla_hash T, dato D) { devolver BusquedaLineal(T[H(K(D))], D) T 0 1 2 3 k=H(K(D’)) = 1 H(k’) k’ 1 k, k’ 2 3 H(k’) = 1 4 5 • Métodos de resolución de colisiones 1. Resolución de colisiones por encadenamiento 2. Resolución de colisiones por direccionamiento abierto Búsqueda por hash 19 • Problema: resolver colisiones 1. Resolución de colisiones por encadenamiento - Utiliza una tabla de punteros a listas enlazadas, en la que T[k] apunta a una lista con los datos D tales que k = H(K(D)) - Realiza una búsqueda lineal de D en la lista de T[H(K(D))] D’ H(k) = 1 Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda por hash H(K(D’)) T 0 k 2. Método de división - Se fija un tamaño de tabla M como un número primo lejano de potencias puras qp, con q primo - La función hash H para una clave k se define así: H(K(D)) = H(k) = k % M D • Colisión - Para dos claves k ≠ k’, se tiene que H(k) = H(k’) - ¿Dónde insertar/buscar k y k’ en la tabla T? H(k) M = 2p (las multiplicaciones son desplazamientos de bits) A = (√5-1)/2 H(K(D)) 17 • Problema: resolver colisiones • Problema: definir la función hash cuasi-inyectiva k=H(K(D)) = 1 Búsqueda por hash 4 D D’ 2. Resolución de colisiones por direccionamiento abierto - La resolución de una colisión en la posición T[H(K(D))] se intenta resolver explorando otras posiciones siguiendo un "sondeo" establecido - Sondeo lineal: al buscar D, - si T[H(K(D))] está vacía, D no está en T - si T[H(K(D))] tiene un dato D’≠D, D se busca en T[H(K(D))]+1 - se repite lo anterior en T[H(K(D))]+2, T[H(K(D))]+3, T[H(K(D))]+4,… - Sondeo cuadrático: al buscar D, - si T[H(K(D))] está vacía, D no está en T - si T[H(K(D))] tiene un dato D’≠D, D se busca en T[H(K(D))]+12 - se repite lo anterior en T[H(K(D))]+22, T[H(K(D))]+32, T[H(K(D))]+42,… 5 Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Búsqueda por hash 20 • Complejidad de la búsqueda por hash N = número de datos en T M = número de punteros en T, i.e. tamaño de T λ= N/M = factor de carga Ae(N, M) = complejidad caso medio en búsqueda exitosa Af(N, M) = complejidad caso medio en búsqueda fallida • Con resolución de colisiones por encadenamiento Ae(N, M) = 1 + λ/2 Af(N, M) = λ • Con resolución de colisiones por direccionamiento abierto Ae(N, M) = 1/λ · log(1/(1-λ)) Af(N, M) =1/(1-λ) Estructuras de Datos y Algoritmos Tema 8. Algoritmos de búsqueda Iván Cantador José R. Dorronsoro Escuela Politécnica Superior Estructura de Datos y Algoritmos Escuela Politécnica Superior Universidad Autónoma de Madrid Universidad Autónoma de Madrid