Estructuras de Datos y Algoritmos

Anuncio
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
Descargar