Facultad de Ciencias Exactas, Ingenierı́a y Agrimensura Escuela de Ciencias Exactas y Naturales Departamento de Computación Estructuras de Datos Práctica 5 Estructuras de Datos para Conjuntos Disjuntos 1. Mı́nimo Offline En este problema se requiere mantener un subconjunto dinámico del conjunto {1, 2, . . . , n} bajo las operaciones Insert y ExtractMin. Se da una secuencia σ de n operaciones Insert y m operaciones ExtractMin, donde cada clave en {1, 2, . . . , n} se inserta exactamente una vez. Se desea determinar qué clave devuelve cada operación ExtractMin. Especı́ficamente, se quiere completar un arreglo extracted[1..m], de tal forma que extracted[i] sea el valor que devuelve la i-ésima operación ExtractMin. El problema se llama offline porque se tiene acceso a la secuencia completa de operaciones antes de necesitar responder cualquier consulta. 1. En la siguiente secuencia de entrada al problema, cada operación Insert se representa por el número que se inserta mientras que cada operación ExtractMin se representa con la letra M : 3, 9, M, 4, 2, M, M, 1, 6, 7, M, 5, M, 8 Complete las entradas del arreglo extracted. 2. Para construir un algoritmo que resuelva el problema es conveniente agrupar las operaciones de la secuencia σ de entrada de la siguiente forma: I1 , M, I2 , M, I3 , . . . , Im , M, Im+1 donde cada M representa una sola operación ExtractMin y cada Ij representa una secuencia (tal vez vacı́a) de operaciones Insert. Para cada subsecuencia Ij se colocan las claves insertadas en un conjunto Kj y luego se ejecuta el siguiente procedimiento: function OfflineMin(n,m) for i ← 1 to n do [ determinar j tal que i ∈ Kj ] i f j 6= m + 1 then extracted [ j ] ← i ; [ determinar el m’inimo l > j tal que Kl exista ] Kl ← Kj ∪ Kl ; [ destruir Kj ] fi od return extracted ; end 3. Explique por qué el algoritmo realmente soluciona el problema. 4. Implemente la función OfflineMin utilizando la estructura de conjuntos disjuntos. Para que la solución sea eficiente, deberá convertir el procedimiento Union en una función que devuelva el representante asignado al conjunto unión resultante y mantener una tabla de traducción entre los representantes de cada conjunto y el nombre Kj que utiliza el algoritmo. Al inicio, puede asumir que los conjuntos Kj y la tabla de traducción correspondiente ya están construidos. Práctica 5 Estructuras de Datos para Conjuntos Disjuntos Página 1 Estructuras de Datos 5. ¿Cuántas llamadas a operaciones Find y cuántas a operaciones Union se realizan al ejecutar OfflineMin(n, m)? 6. Para cada una de las representaciones de la estructura de conjuntos disjuntos vistas, calcule el orden O de su implementación de OfflineMin. 2. Entendiendo la demostración. Para entregar: El programa union_find.c, disponible en la página de la materia1 , recibe como argumentos tres números n, u y f . Este programa crea n elementos, ejecuta u operaciones union en conjuntos al azar, y luego ejecuta f operaciones find de elementos al azar. Finalmente, imprime el número de nodos visitados en operaciones find. Cambie el programa para que después de las operaciones union, el programa imprima para cada árbol con rango mayor o igual que 4: el rango de cada árbol, la altura de cada árbol, la cantidad de nodos del árbol la cantidad de nodos con rango r, para cada r ≥ 4 Ejecutando el programa con n = 106 , u = 5 × 105 , f = 0, relacione los resultados impresos por su programa con los resultados vistos en teorı́a respecto de estas cantidades. Cambie el programa para que al final imprima (todas las cantidades se refieren al conjunto total de las operaciones find y las operaciones union): La cantidad de grupos de rangos (los grupos g0 , g1 , · · · del análisis visto en teorı́a) La cantidad de nodos en cada grupo de rangos Para cada nodo n, la cantidad cn de veces que un nodo fue visitado hasta que le fue asignado un padre en otro grupo Para cada grupo, la suma de todos los cn para todos los nodos n en ese grupo El costo asignado a cada nodo del segundo tipo de operaciones El costo asignado a cada nodo del primer tipo de operaciones Ejecutando el programa con n = 106 , u = 5 × 105 , f = 106 , relacione los costos asignados a los nodos por los dos tipos de operaciones con la cantidad de nodos visitados, y en general relacione todos los valores que su programa imprime con los resultados vistos en teorı́a respecto de esas cantidades. 1 El cual probablemente tiene muchos errores, y por tanto no deberı́a usted tomarlo como la verdad verdadera, si no preguntar en caso de duda. Compilar con -std=c99 (compilar, compila bien, eh) Práctica 5 Estructuras de Datos para Conjuntos Disjuntos Página 2