400 likes | 649 Views
Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante listas enlazadas 3.2. El TDA diccionario. 3.3. Tablas de dispersión. 3.3.1. Dispersión abierta. 3.3.2. Dispersión cerrada. 3.3.3. Funciones de dispersión.
E N D
Tema 3. Conjuntos y diccionarios. 3.1. Conjuntos. 3.1.1. Implementación por vectores de bits 3.1.2. Implementación mediante listas enlazadas 3.2. El TDA diccionario. 3.3. Tablas de dispersión. 3.3.1. Dispersión abierta. 3.3.2. Dispersión cerrada. 3.3.3. Funciones de dispersión. 3.4. Combinación de estructuras de datos. 3.4.1. Relación muchos a muchos. 3.4.2. Listas múltiples. 3.4.3. Estructuras de datos múltiples A.E.D. 1 Tema 3. Conjuntos.
3.1. Conjuntos. Definiciones y propiedades. • Conjunto: colección no ordenada de elementos (o miembros) distintos. • Elemento: cualquier cosa, puede ser un conjunto o un elemento primitivo (átomo). En programación: • Puede haber repetición de elementos (bolsas). • Todos los elementos suelen ser del mismo tipo (enteros, caracteres, cadenas, ...) • Los elementos pueden estar ordenados. Relación “<“ de orden de un conjunto S: • Orden total: para todo a, b, sólo una de las afirmaciones (a<b), (b<a) o (a=b) es cierta. • Propiedad transitiva: para todo a, b, c, si (a<b) y (b<c) entonces (a<c). A.E.D. 2 Tema 3. Conjuntos.
3.1. Conjuntos. Notación de conjuntos. • Definición: Por extensiónMediante proposiciones A= {a, b, c, .., z} C= {x | proposición de x} B= {1, 4, 7} = {4, 7, 1} D= {x | x es primo y menor que 90} • Pertenencia: x A • No pertenencia: x A • Conjunto vacío: V = Ø • Conjunto universal: U = U • Inclusión: A B • Intersección: A B • Unión: A B • Diferencia: A - B A.E.D. 3 Tema 3. Conjuntos.
3.1. Conjuntos. El TDA Conjunto: Operaciones más comunes. A, B, C y S conjuntos; x de tipo elemento • Unión (A, B, C) C:= A B • Intersección (A, B, C) C:= A B • Diferencia (A, B, C) C:= A - B • Combina (A, B, C) C:= A B, con A B = Ø • bool= Miembro (x, A) Verdad si x A. Falso si x A • Anula (A) A:= Ø • Inserta (x, A) A:= A {x} • Suprime (x, A) A:= A - {x} • Asigna (A, B) A:= B • Min (A) Devuelve el menor elemento de A • Max (A) Devuelve el mayor elemento de A • bool= Igual (A, B) Verdad si A = B. Falso si A B • S= Encuentra (x) Devuelve el conjunto al que pertenece x A.E.D. 4 Tema 3. Conjuntos.
3.1. Conjuntos. Ejemplos. A:= {3, 5, 6, 8} B:= {2, 3, 5, 7, 9} • Unión (A, B, C) C:= {3, 5, 6, 8, 2, 7, 9} • Intersección (A, B, C) C:= {3, 5} • Diferencia (A, B, C) C:= {6, 8} • Combina (A, B, C) Error, ya que A B Ø • Miembro (6, A) Verdad • Anula (A) A:= Ø • Inserta (5, A) A:= {3, 5, 6, 8} • Inserta (2, A) A:= {2, 3, 5, 6, 8} • Suprime (1, A) A:= {3, 5, 6, 8} • Asigna (A, B) A:= {2, 3, 5, 7, 9} • Min (A) 3 • Max (A) 8 • Igual (A, B) Falso • Encuentra (7) B • Encuentra (3) Error, ya que 3 A, 3 B. A.E.D. 5 Tema 3. Conjuntos.
3.1. Conjuntos: implementaciones. • Dos tipos de implementaciones básicas: • Mediante vectores de bits. • Mediante listas enlazadas. • La mejor implementación depende del uso que hagamos de los conjuntos: • Operaciones más frecuentes. • Tamaño de los conjuntos usados. A.E.D. 6 Tema 3. Conjuntos.
a b c d e f g A 1 0 1 1 0 0 1 B 0 0 1 0 1 1 1 È A B 1 0 1 1 1 1 1 Ç A B 0 0 1 0 0 0 1 A - B 1 0 0 1 0 0 0 3.1.1. Conjuntos: implementación por vectores de bits. • Idea:Cada elemento del conjunto universal se representa con 1 bit. Para cada conjunto A, el bit asociado a un elemento vale: 1 - si el elemento pertenece al conjunto A 0 - si el elemento no pertenece a A • Definición: tipo Conjunto = array [1..N] de booleano A.E.D. 7 Tema 3. Conjuntos.
3.1.1. Conjuntos: implementación por vectores de bits. • Unión (A, B, C) O(n) Para cada elemento i del conjunto universal hacer C[i]:= A[i] O B[i] • Intersección (A, B, C) O(n) Para cada elemento i del conjunto universal hacer C[i]:= A[i] Y B[i] • Diferencia (A, B, C) O(n) Para cada elemento i del conjunto universal hacer C[i]:= A[i] Y NO B[i] • Inserta (i, A) , Suprime (i, A) O(cte) A[i]:= 1 A[i]:= 0 ¿Cómo serían: Miembro, Combina, Anula, Asigna, Igual, Min, Max, Encuentra, ...? A.E.D. 8 Tema 3. Conjuntos.
3.1.1. Conjuntos: implementación por vectores de bits. Ventajas: • Operaciones muy sencillas de implementar. Se pueden realizar sin necesidad de usar memoria dinámica. • Miembro, Inserta y Suprime tienen un tiempo constante. • Unión, Intersección y Diferencia se pueden realizar en un tiempo proporcional al tamaño del conjunto universal. • Si el conjunto universal es tan pequeño como el nº de bits de una palabra de la máquina, las operaciones anteriores se pueden realizar con una simple operación lógica. Inconvenientes: • Utiliza espacio proporcional al tamaño del conjunto universal. • El conjunto universal no puede ser muy grande ni infinito. • Cada elemento debe tener un índice. A.E.D. 9 Tema 3. Conjuntos.
3.1.2. Conjuntos: Implementación mediantelistas enlazadas. • Idea: Guardar en una lista los elementos del conjunto. • Definición: tipo Conjunto[Tipo ] = Lista[Tipo]; • Si el conjunto tiene un orden, se pueden usar listas ordenadas para mejorar la eficiencia de las operaciones. Ventajas: • Utiliza espacio proporcional al tamaño del conjunto representado (no al conjunto universal). • El conjunto universal puede ser muy grande, o incluso infinito. Inconvenientes: • Operaciones más complejas de implementar. • Algunas operaciones son menos eficientes. A.E.D. 10 Tema 3. Conjuntos.
3.1.2. Conjuntos: Implementación mediantelistas enlazadas. Listas no ordenadas. • Miembro (x, A) • Es necesario recorrer toda la lista: O(n) Para cada elemento act de la lista hacer Si (x=act) entonces devolver Verdad Devolver Falso • Intersección (A, B, C) • Un elemento está en la intersección si está en las listas A y B. • Comparar cada elemento de A con cada uno de B: O(n2) Anula(C) Para cada elemento act de la lista A hacer Si (Miembro(act, B)) entonces Inserta(act, C) ¿Cómo serían: Unión, Diferencia, Combina, Anula, Asigna, Igual, Min, Max, ...? A.E.D. 11 Tema 3. Conjuntos.
3.1.2. Conjuntos: Implementación mediantelistas enlazadas. Listas ordenadas. • Miembro (x, A) • Puesto que la lista está ordenada, sólo es necesario buscar hasta encontrar x o un elemento mayor que x. • En el caso medio necesitaremos buscar n/2 posiciones: O(n). act:= Primero(A) Mientras (act Nil) y (act x) hacer Si (x=act) entonces devolver Verdad Sino act:= Siguiente(act, A) Devolver Falso A.E.D. 12 Tema 3. Conjuntos.
3.1.2. Conjuntos: Implementación mediantelistas enlazadas. Listas ordenadas. • Intersección (A, B, C): Recorrer las dos listas a la vez, avanzando la que tenga valor actual menor: O(n). act1:= Primero (A) act2:= Primero (B) Anula (C) Mientras (act1 Nil) y (act2 Nil) hacer Si (act1=act2) entonces Inserta(act1, C) act1:= Siguiente(act1, A) act2:= Siguiente(act2, B) Sino Si (act1 < act2) entonces act1:= Siguiente(act1, A) Sino act2:= Siguiente(act2, B) A.E.D. 13 Tema 3. Conjuntos.
3.1.2. Conjuntos: Implementación mediantelistas enlazadas. Listas ordenadas. • Unión (A, B, C) • Es muy parecido. Meter todos los elementos de A y B en orden. • Si hay dos elementos iguales se mete uno. En otro caso se mete el menor, y se avanza la lista correspondiente. • Cuando acaba una lista se meten los que queden de la otra lista. • Diferencia (A, B, C) • Meter el elemento actual de A si es menor que el de B (no si son iguales o si es mayor). • Asigna (A, B) • Copiar la lista B en A. • No es suficiente con apuntar A a B, pues entonces si se modificara B también se modificaría A. A.E.D. 14 Tema 3. Conjuntos.
3.1.2. Conjuntos: Implementación mediantelistas enlazadas. Listas ordenadas. • Min (A), Max (A) • El primero y el último elemento de la lista, respectivamente. ¿Coste? • Suprime (x, A) • Buscar x, eliminarlo si existe. • Inserta (x, A) • Insertar el elemento en la posición adecuada.Se busca hasta que se halle uno igual o mayor, o el fin de la lista. Si es igual no se inserta. Si es mayor se inserta antes. A.E.D. 15 Tema 3. Conjuntos.
3.2. El TAD diccionario. • En muchas aplicaciones necesitamos guardar datos de un conjunto de elementos, que pueden variar en tiempo de ejecución. • P. ej.: agenda electrónica, diccionario de sinónimos, base de datos de empleados, notas de alumnos, etc. • Particularidades: • Los datos se guardan en un solo sitio, no siendo necesarias las operaciones de unión, intersección o diferencia. • Cada elemento tiene una clave, y asociado a ella se guardan una serie de valores. • Definición: Una asociación es un par (clave: tipo_clave, valor: tipo_valor). tipo Asociacion = registro clave: tipo_clave valor: tipo_valor finregistro A.E.D. 16 Tema 3. Conjuntos.
3.2. El TDA diccionario. • Definición: Un diccionario es un conjunto de asociaciones, con las operaciones Inserta, Suprime, Miembro y Anula. • Implementación: • Con vectores de bits: Conjunto universal muy limitado. ¿Cómo conseguir la asociación clave-valor? • Con listas enlazadas: Representación más compleja y menos eficiente. • Otra posibilidad es la representación mediante arrays. tipo Diccionario = registro último: entero datos: array [1..máximo] de Asociacion finregistro • La representación es más sencilla, pero hay un límite en el tamaño de los diccionarios. A.E.D. 17 Tema 3. Conjuntos.
3.2. El TDA diccionario. • Anula (D: Diccionario) D.último:= 0 • Miembro (x: tipo_clave, D: Diccionario): tipo_valor Desde i:= 1 hasta D.último hacer Si (D.datos[i].clave=x) Devolver D.datos[i].valor Devolver NULO • Inserta (x: tipo_clave, v: tipo_valor, D: Diccionario) Si (no Miembro(x, D)) Si (D.último < máximo) D.último:= D.último + 1 D.datos[D.último]:= (x, v) Sino Error (‘El diccionario está lleno’) • Suprime (x: tipo_clave, D: Diccionario) i:= 1 Mientras (D.datos[i].clave x) y (i < D.último) hacer i:= i+1 Si (D.datos[i].clave = x) D.datos[i]:= D.datos[D.último] D.último:= D.último - 1 A.E.D. 18 Tema 3. Conjuntos.
3.3. Tablas de dispersión (tablas hash). • La representación de conjuntos o diccionarios con listas o arrays tiene un tiempo de O(n), para Inserta, Suprime y Miembro. • Con vectores de bits el tiempo es O(cte), pero tiene muchas limitaciones. • ¿Cómo aprovechar lo mejor de uno y otro tipo? • Idea: • Usar un array con B posiciones (0, ..., B-1). • Dada una clave x (sea del tipo que sea) calcular una posición mediante una función: h(x) = posición en (0..B-1) h: Función de dispersión • El elemento (x, v) se inserta en esa posición. A.E.D. 19 Tema 3. Conjuntos.
3.3. Tablas de dispersión (tablas hash). • Para buscar el elemento con clave x, aplicar la función h(x) y buscar en la posición correspondiente. • Ej.: Si x de tipo entero h(x) = x módulo B Si x de tipo cadena h(x) = (suma de códigos ascii (x)) mod B • Ej.: B= 10; x de tipo entero; h(x) = x mod 10 D= {9, 25, 33, 285, 541, 543, 1976, 2180} • En promedio se necesita un tiempo constante O(cte): aplicar h(x) y acceder a esa posición. A.E.D. 20 Tema 3. Conjuntos.
3.3. Tablas de dispersión (tablas hash). • El tipo de x no está restringido. Si es un registro, podemos tomar uno de sus campos como clave, y aplicar la función sobre él. • Función de dispersión: h: Clave [0, ..., B-1] • Tamaño de la tabla B: aproximadamente sobre el número de elementos de los conjuntos (normalmente, B << rango de claves). • ¿Qué ocurre si para dos elementos distintos x, y, ocurre que h(x) = h(y)? • Definición: Si (x y) (h(x) = h(y)) entonces se dice que x, y son sinónimos. • Los distintos métodos de dispersión difieren en el tratamiento de los sinónimos. Tipos de dispersión: • Dispersión abierta. • Dispersión cerrada. A.E.D. 21 Tema 3. Conjuntos.
3.3.1. Dispersión abierta. • Las celdas del array no son elementos (o asociaciones), sino listas de elementos, también llamadas cubetas. tipe TablaHash= array [0..B-1] de Lista_asociacion • La tabla de dispersión está formada por B cubetas. Dentro de cada cubeta se encuentran los elementos sinónimos (con igual valor de h). • El conjunto de sinónimos es llamado clase. A.E.D. 22 Tema 3. Conjuntos.
3.3.1. Dispersión abierta. • Coste de inserta, suprime, consulta, con conjunto con n elementos: • Repartidos de forma equitativa: O(1+n/B). Con B>n es O(const) • Todos los elementos sinónimos: O(n). • Ocupación de memoria, Cada puntero ocupa k1 bytes, y cada asociación k2 bytes: B*k1+n*(k1+k2) A.E.D. 23 Tema 3. Conjuntos.
3.3.2. Dispersión cerrada. • Las celdas del array son elementos del diccionario (no listas). No se ocupa un espacio adicional de memoria en listas. tipo TablaHash= array [0..B-1] de Asociacion • Si al insertar un elemento nuevo x, ya está ocupado h(x), se dice que ocurre una colisión. • En este caso será necesario hacer redispersión: buscar una nueva posición para meter el elemento. • Redispersión: Si falla h(x), aplicar h1(x), h2(x), ... hasta encontrar una posición libre. • Redispersión lineal: hi(x)= (h(x) + i) mod B • La secuencia de posiciones recorridas para un elemento se suele denominar cadena o secuencia de búsqueda. A.E.D. 24 Tema 3. Conjuntos.
3.3.2. Dispersión cerrada. • Miembro (x, D): • Examinar la posición h(x). • Si x está en la posición h(x) entonces devolver Verdad (o Tabla[h(x)].valor). • Si está vacía entonces no es miembro, devolver Falso. • En otro caso, la posición está ocupada pero por otro elemento. Debemos examinar las posiciones h1(x), h2(x), ... y así sucesivamente hasta encontrar x, vacío o examinar toda la tabla. • ¿Qué ocurre con la eliminación de elementos? Necesitamos una marca especial “suprimido”, que indique la posición de un elemento borrado. • En la función Miembro, se sigue la búsqueda al llegar a un suprimido. • En Inserta el espacio de ese elemento se puede utilizar (como si fuera vacío). • Problema de la redispersión lineal: Si se llenan varias cubetas consecutivas y hay una colisión, se debe consultar todo el grupo. Aumenta el tamaño de este grupo, haciendo que las inserciones y búsquedas sean más lentas. A.E.D. 25 Tema 3. Conjuntos.
3.3.2. Dispersión cerrada: operaciones Operación Buscar(D:Diccionario[tclave,tvalor];c:tclave):entero i:= 1 k:= h(c) mientras (i<B) Y (D[k].clave≠NULO) Y (D[k].clave≠c) k:=hi(c) i:=i + 1 finmientras devolver k operación Inserta(var D:Diccionario[tclave,tvalor];c:tclave;v:tvalor) k:=Buscar(D,c) si (D[k].clave=NULO) O (D[k].clave=c) D[k].clave:=c D[k].valor:=v sino error (``La tabla está llena.'') finsi A.E.D. 26 Tema 3. Conjuntos.
3.3.2. Dispersión cerrada: operaciones Operación Suprime(var D:Diccionario[tclave,tvalor];c:tclave) k:=Buscar(D,c) si (D[k].clave=c) D[k].clave:=SUPRIMIDO D[k].valor:=NULO finsi • Si las eliminaciones son frecuentes pérdida de eficiencia: Cada ver que se suprime mover datos en la misma clase para evitar huecos. De vez en cuando eliminar los SUPRIMIDO de la tabla. A.E.D. 27 Tema 3. Conjuntos.
3.3.2. Dispersión cerrada • Coste memoria: B*k2 normalmente k2>k1, y B*k2>B*k1+n*(k1+k2) (dispersión abierta) • Coste de Insertar: Probabilidad colisión: n/B Probab. al menos dos colisiones: n/B*(n-1)/(B-1) ≈ n/B*n/B ... Longitud promedio de búsqueda: 1+n/B+(n/B)2+...+(n/B)n<1/(1-n/B) Si n próximo a B, valor muy alto: establecer capacidad máxima de llenado de las cubetas, y reestructurar cuando se llega a ese valor. A.E.D. 28 Tema 3. Conjuntos.
3.3.3. Funciones de dispersión. • Propiedades de una buena función de dispersión • La función debe minimizar el número de sinónimos: debe ser lo más aleatoria posible y repartir los elementos en la tabla de manera uniforme. • La función debe ser fácil de calcular (buscamos eficiencia). • Ojo: h(x) es función de x, devuelve siempre el mismo valor para un mismo valor de x. Algunas funciones de dispersión • Método de la multiplicación: h(x) = (x * C) mod B; para algún C, con C y B primos entre sí • Método de la división: h(x) = (x mod P) mod B; P > B • Método de tomar los dígitos centrales: Escoger un C, tal que BC2 K2, para x en el intervalo (0, ..., K). h(x)= x2 / C mod B Ej.: K= 1000; B= 8; C=354; h(456)= 3 • Otro posible método: h(x) = (C1*x2 / C2 + x*C3) mod B A.E.D. 29 Tema 3. Conjuntos.
3.3.3. Funciones de dispersión. • Método de plegado o folding. Con cadenas. Agrupar caracteres de n en n: Cada carácter es un número en el intervalo 0..127. Se suman los valores de los grupos. Ej.: x= abcdefgh h(x):= ( (128)3a + (128)2b + (128)c + d +(128)3e + (128)2f + (128)g + h ) mod B; Con enteros. Agrupar los dígitos de n en n: h(x) = ((x div 109) + (x div 106) + (x div 103) + x ) mod B Con reales. Agrupar dígitos decimales de n en n: h(x) = ((x * 100) + (x * 104) + (x * 106) + ... ) mod B • Extracción: Evita el coste O(n), tomando sólo una parte de la clave. • Método de base: Hacer cambio de base de la clave y considerarlo en la base original. Ej: 1999, en base 9 es 2661, y se hace 2661 mod B A.E.D. 30 Tema 3. Conjuntos.
3.3.3. Estrategias de redispersión. • Intervalos constantes mayores que 1: hi(x) = (h(x) + C*i) mod B; para algún C>1 • Ej.: B= 8, C= 3, h(x)= 4, se buscaría en: 4, 7, 2, 5, 0, 2, 6, 1. • B y C deben ser primos entre sí, para buscar en todas las posiciones. • No se soluciona el problema de la lineal, ya que se crean grupos a saltos de C. • Redispersión cuadrática: hi(x) = (h(x) + (-1)i-1(i+1)/22) mod B Para que se recorran todos los valores B debe ser primo de la forma B=4k+3 • Saltos de tamaño variable, o redispersión doble: hi(x) = (h(x) + i*C(x)) mod B C(x) da valores en (1,2,...,B-1) Ej: C(x)=1+(x2/D+Ex) mod (B-1) A.E.D. 31 Tema 3. Conjuntos.
3.3.3. Estrategias de redispersión. • Permutaciones aleatorias: hi(x) = (h(x) + Di) mod B; para Di= (D1, D2, ...) una permutación de 1, 2, ..., B-1 • La permutación es fijada de antemano. • Se soluciona el problema para determinadas permutaciones Di. Método para obtener una permutación: • Sea B una potencia de 2. Se toma una constante K, en el intervalo (1, ..., B-1). • Empezamos con un valor cualquiera D1= Di • Di+1:= 2*Di • Si Di+1>B entonces Resta:= Di+1 - B; Di+1:= Resta K; Di = (5, 1, 2, 4, 3, 6, 7, 5, ...) Ej.: B = 8; K = 3 = 011b; D1 = 5 = 101b A.E.D. 32 Tema 3. Conjuntos.
3.3.3. Funciones de dispersión. Eficiencia • Dispersión abierta. • Tenemos B cubetas, y N elementos almacenados en total. • Cada lista tendrá de media N/B miembros. • Inserta, Suprime y Miembro tendrán un tiempo de O(1+N/B). • Si N B, entonces tendremos O(cte). • Suponemos una buena función h: reparte los elementos en las cubetas de forma uniforme. • Dispersión cerrada. • La tabla nunca se puede llenar con más de B elementos. • La probabilidad de colisión crece cuantos más elementos haya, disminuyendo la eficiencia. • El costo de Inserta es O(1/(1-N/B)). Cuando N B tiende a infinito. Reestructuración de las tablas de dispersión • Para evitar el problema de la pérdida de eficiencia, si el tamaño de N aumenta mucho, se puede crear una nueva tabla con más elementos B, reestructurar. • Dispersión abierta: reestructurar si N > 2 B • Dispersión cerrada: reestructurar si N > 0.9 B A.E.D. 33 Tema 3. Conjuntos.
3.4. Combinación de estructuras de datos.3.4.1. Relación muchos a muchos. • En muchas aplicaciones se requiere almacenar información de dos tipos distintos y relaciones entre objetos de esos tipos. • Ej.: base de datos de alumnos, cursos y matriculaciones de alumnos en cursos; personas, libros y préstamos de libros a personas. • Asociación de muchos a muchos: un alumno puede estar matriculado en muchos cursos y en un curso pueden haber muchos alumnos. Representaciones posibles • Array bidimensional: Matricula[Alumno, Curso] = (0, 1) • Insertar, Suprimir son muy rápidas. • Consultar los cursos de un alumno y los alumnos de un curso: recorrer una fila o una columna, respectivamente, de la matriz. O(n) • La memoria está mal utilizada. A.E.D. 34 Tema 3. Conjuntos.
3.4.1. Relación muchos a muchos. Representaciones posibles • Mediante conjuntos: A= conjunto de alumnos, C= conjunto de cursos, I= conjunto de matrículas. • Representando los conjuntos mediante listas enlazadas: A : Lista [tipo_alumno] C : Lista [tipo_curso] I : Lista [tipo_matrícula] • La memoria está mejor utilizada, sólo se representan las posiciones con X. • Las operaciones de consulta requieren recorrer todo el conjunto I: son muy lentas. tipo_matrícula= registro id_alumno: entero id_curso: entero finregistro tipo_alumno= registro id_alumno: entero nombre: cadena[30] finregistro tipo_curso= registro id_curso: entero nombre: cadena[50] finregistro A.E.D. 35 Tema 3. Conjuntos.
3.4.2. Listas múltiples. • Una estructura de listas múltiples es una colección de celdas en la que algunas de ellas pueden pertenecer a más de una lista a la vez. • En nuestro caso tenemos: • Los elementos pueden ser de tres tipos: alumnos, cursos o matrículas. • Los alumnos forman una lista y los cursos otra. • Los elementos de matrícula (a, c) pertenecen a dos listas: lista de matriculaciones del alumno a, y lista de matriculaciones del curso c. • Cada registro de alumno apunta al primer elemento de la lista de matriculaciones de ese alumno. • Cada registro de curso apunta al primer elemento de la lista de matriculaciones en ese curso. tipo clase_registro = (alumno, curso, matrícula) tipo_registro = registro case clase: clase_registro de alumno: (nombre_alumno: cadena[30]; pri_curso, sig_alumno: ^tipo_registro) curso: (nombre_curso: cadena[50]; pri_alumno, sig_curso: ^tipo_registro) matrícula: (a_sig, c_sig: ^tipo_registro) finregistro A.E.D. 36 Tema 3. Conjuntos.
Registros de cursos Dolores Alicia Pepito Física Juan Juan Física A.E.D. Algebra Registros de alumnos registros de matrículas nombre_ sig_ pri_ alumno alumno curso nombre_ pri_ sig_ curso alumno curso c_sig a_sig 3.4.2. Listas múltiples. Estructura de listas múltiples • Las listas de los registros de matrículas son circulares. • Memoria bien utilizada, no hay límite en los conjuntos. • La búsqueda de alumnos en cursos y cursos en alumnos es rápida. A.E.D. 37 Tema 3. Conjuntos.
3.4.3. Estructuras de datos múltiples. • Una aplicación almacena información sobre determinados objetos. • Necesitamos acceder a los objetos de forma ordenada (según determinada propiedad de los mismos) y de forma directa (según otra propiedad). • Ejemplo: Tipo Empleado=registro Nombre, Direccion: cadena DNI, sueldo: entero Telefonos: Lista[entero] Finregistro Lista: Lista[Empleado] • Consulta individual: por DNI, nombre, o teléfono. • Actualización: insertar, eliminar, o modificar empleado, accediendo por DNI. • Listado: por DNI, o por sueldo. A.E.D. 38 Tema 3. Conjuntos.
3.4.3. Estructuras de datos múltiples. • Lista ordenada por sueldo: • Listado por sueldo O(n) • Listado por DNI, ordenar la lista, O(n log n) • Consulta por DNI o nombre, recorrer toda la lista, O(n). Lo mismo actualización. • Consulta por teléfono, recorrer lista y listas de teléfonos, O(n*t) • Tabla de dispersión con claves los nombres: • Consulta por nombre, O(1) • Consulta por DNI, recorrer la tabla, O(B) o O(B*r). Lo mismo actualización. • Listado por sueldo o DNI, obtener los datos y ordenar, O(B+n log n) o O(B*r+n log n) • Consulta por teléfono, recorrer lista y listas de teléfonos, O(B+n*t) o O(B*r+n*t) • Tabla de dispersión con claves los teléfonos: • Acceso rápido por teléfono. • Árbol binario de búsqueda con claves los DNI: • Listado por DNI, O(n) • Búsqueda por DNI, O(log n) A.E.D. 39 Tema 3. Conjuntos.
3.4.3. Estructuras de datos múltiples. • Tipo Empleados=registro ListaSueldos: Lista[Puntero[Empleado]] HashNombres: TablaHash[cadena,Puntero[Empleado]] HashTelefonos: TablaHash[entero,Puntero[Empleado]] ArbolDNI: ArbolBinarioBusqueda[entero,Puntero[Empleado]] finregistro A.E.D. 40 Tema 3. Conjuntos.