• No se han encontrado resultados

Estructuras de Datos y Algoritmos: Boletín de Problemas

N/A
N/A
Protected

Academic year: 2021

Share "Estructuras de Datos y Algoritmos: Boletín de Problemas"

Copied!
24
0
0

Texto completo

(1)

Problemas

(Facultad de Inform´atica)

Curso 2004–05

(2)

Conjuntos

1. Dado un diccionario S representado mediante “direccionamiento directo”; escribir un algoritmo que encuentre el m´aximo elemento de S. ¿Qu´e coste temporal tendr´ıa el algoritmo en el peor caso?

2. Dadas las siguientes definiciones de clases para declarar y manipular tablas de dispersi´on:

1 struct n o d o _ l i s t a {

2 char * pal ;

3 n o d o _ l i s t a * s i g u i e n t e ;

4 };

5 class hash {

6 n o d o _ l i s t a ** vector ;

7 int t a m a n y o ;

8 u n s i g n e d int f u n c i o n _ h a s h (char * p a l a b r a );

9 public:

10 hash (int tam ); // c o n s t r u c t o r

11 void i n s e r t a (char * p a l a b r a );

12 n o d o _ l i s t a * buscar (char * p a l a b r a );

13 };

14 hash :: hash (int tam ) { // c o n s t r u c t o r

15 t a m a n y o = tam ;

16 vector = new ( n o d o _ l i s t a *)[ t a m a n y o ];

17 for (int i =0; i < t a m a n y o ; i ++) vector [ i ] = 0;

18 }

Se pide:

1. nadir un m´etodo que introduzca en la tabla de dispersi´on los elementos pertenecientes a otra tabla T . Estudia el coste temporal del algoritmo.

2. nadir un m´etodo que introduzca en la tabla de dispersi´on los elementos pertenecientes a la diferencia T 2 − T 1 de las tablas de dispersi´on T 1 y T 2; es decir, aquellos elementos que est´an en T 2 y no est´an en T 1. Estudia el coste temporal del algoritmo.

3. Escribir un m´etodo que compruebe si otra tabla de dispersi´on T contiene los mismos ele- mentos. Estudia el coste temporal del algoritmo.

4. Escribir un m´etodo que obtenga el m´ınimo del conjunto representado como tabla de disper- si´on. Estudia el coste temporal del algoritmo.

Nota:Los siguientes ejercicios de mont´ıculos se refieren a un maxheap.

3. Escribe un algoritmo recursivo que, dada una clave x, obtenga, de la forma m´as eficiente posible, la posici´on que ocupa en un mont´ıculo. Si la clave no se encuentra, el algoritmo debe devolver el valor −1. ¿Cu´al ser´ıa el coste temporal del algoritmo en el peor caso?

4. Realiza una traza del algoritmo A.heapify(3) para el vector A = { 27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0 }.

5. ¿Cu´al es el resultado de realizar una llamada a A.heapify(i) para i > talla Heap/2? ¿Y si la clave del nodo i es mayor que la de sus hijos?

6. Realiza una traza del algoritmo build Heap para el vector A = { 5, 3, 17, 10, 84, 19, 6, 22, 9 }.

7. ¿Por qu´e el bucle del algoritmo build Heap se realiza decrementando un ´ındice i desde ta- lla Heap/2 hasta 1, y no se realiza desde 1 hasta talla Heap/2?

(3)

8. Realiza una traza del algoritmo heapsort para el vector A = {5, 13, 2, 25, 7, 17, 20, 8, 4}.

9. Realiza una traza de todas las llamadas a la funci´on heapify que se realizan en el ejemplo del funcionamiento del algoritmo heapsort.

10. ¿Cu´al ser´a el coste temporal del algoritmo heapsort al aplicarlo sobre un vector A de talla n, si los elementos del vector est´an ordenados en orden creciente? ¿Y si estuvieran ordenados en orden decreciente?

11. Realiza una traza de la operaci´on A.insertar(3) para el mont´ıculo A = {15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1}. Realiza otra para la operaci´on A.insertar(16).

12. Realiza una traza de la operaci´on A.extract max() para el mont´ıculo A = {15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1}.

13. Escribe un algoritmo e implementa el m´etodo incrementa clave(i,k) que con un coste temporal O(log n), donde n es el n´umero de elementos del mont´ıculo A, modifique la clave del nodo i por k, ´unicamente si se cumple que k > A[i], y reorganice el mont´ıculo para que siga si´endolo.

14. Escribe un algoritmo e implementa el m´etodo decrementa clave(i,k) que con un coste temporal O(log n), donde n es el n´umero de elementos del mont´ıculo A, modifique la clave del nodo i por k, ´unicamente si se cumple que k < A[i], y reorganice el mont´ıculo para que siga si´endolo.

15. Escribe un algoritmo e implementa el m´etodo elimina clave(i) que con un coste temporal O(log n), donde n es el n´umero de elementos del mont´ıculo A, borre del mont´ıculo la clave del nodo i, y reorganice el mont´ıculo para que siga si´endolo.

16. Dado el siguiente MF-set:

PSfrag replacements

1 1

1

1 3 3 6 2 8 6

1 2 3 4 5 6 7 8 9 10

M

1. Dibuja cada uno de los ´arboles que representan los subconjuntos disjuntos que contiene el MF-set.

2. Muestra como se van transformando los ´arboles, despu´es de ejecutar cada una de las ope- raciones de la secuencia indicada. Utiliza los heur´ısticos uni´on por rango y compresi´on de caminos. En la uni´on, en caso de que la altura de los ´arboles a unir sea id´entica, la ra´ız del primer ´arbol debe pasar a ser hijo de la ra´ız del segundo ´arbol.

a) Union(3,6) b) Buscar(4) c) Union(1,6) d ) Buscar(10)

(4)

Divide y Vencer´ as

17. Algoritmo de ordenaci´on “inserci´on directa”.

1. Realiza una traza del algoritmo “inserci´on directa” al aplicarlo sobre el vector: A = {14, 2, 20, 39, 8, 28, 4, 10, 24, 6, 22, 2}.

2. Realiza una traza del algoritmo “inserci´on directa” al aplicarlo sobre el vector: A = {1, 2, 8, 12, 15, 28}. ¿Qu´e ocurre con el coste temporal del algoritmo cuando el vector est´a ordenado, como en este caso, de forma creciente (sin repeticiones)? ¿Est´a en el mejor o en el peor caso?

3. Realiza una traza del algoritmo “inserci´on directa” al aplicarlo sobre el vector: A = {33, 31, 20, 10, 8, 2}. ¿Qu´e ocurre con el coste temporal del algoritmo cuando el vector est´a ordenado, como en este caso, de forma decreciente (sin repeticiones)? ¿Est´a en el mejor o en el peor caso?

4. ¿Cu´al ser´a el coste del algoritmo “inserci´on directa” si todos los datos del vector son iguales?

¿Est´a en su caso mejor o peor?

5. Escribe una versi´on recursiva del algoritmo “inserci´on directa”. Analiza el coste del algoritmo para esta versi´on.

18. Algoritmo de ordenaci´on “selecci´on directa”.

1. Realiza una traza del algoritmo “selecci´on directa” al aplicarlo sobre el vector: A = {21, 9, 33, 12, 45, 33, 12, 7, 5, 11, 21, 40, 44}.

2. ¿Cu´al es el coste temporal del algoritmo cuando los datos del vector presentan, inicialmente, una ordenaci´on creciente o decreciente (sin repeticiones) de los datos? ¿Y cuando todos los datos son iguales?

3. Escribe una versi´on recursiva del algoritmo “selecci´on directa”. Analiza el coste del algoritmo para esta versi´on.

19. Resuelve las seguientes relaciones de recurrencia con T (1) = 1 y a, b, c > 0:

T (n) = aT (n − 1) + bn, T (n) = aT (n − 1) + bnc, T (n) = T (n/2) + bn log n, T (n) = aT (n/2) + bnc.

Pista: aplica sucesivamente el m´etodo de substituci´on.

20. La figura 1 muestra una traza completa en ´arbol de los argumentes de las llamadas recursivas que genera el algoritmo de ordenaci´on por fusi´on (Mergesort) para el vector {10, 3, 50, 11, 3, 1, 3, 45, 1}.

Simula el recorrido de este ´arbol tal y como lo har´ıa un lenguaje de programaci´on que permita definiciones recursivas. Para cada llamada recursiva se ha representado su argumento y un vector en blanco para que puedas representar el estado de salida del vector para esta llamada. Numera el orden en que se ir´ıan obteniendo los resultados parciales intermedios. Por ejemplo, en la figura 1 aparece en negrita el primer resultado parcial que se calcular´ıa. Nota que las hojas del ´arbol corresponden al caso base de la definici´on recursiva y, consecuentemente, los vectores unitarios no sufren ning´un cambio.

(5)

10 3 11 3 1 3 1

3

3 11

11

1

3 1 1

45

45 50

10 50 11 3 3 45 1

45 45

10 50

10 3 50 3 1 3 1

1 3

10 3

Figura 1: Llamadas realizadas al algoritmo Mergesort.

21. Realiza una traza del algoritmo Mergesort al aplicarlo sobre el vector A = {12, 8, 21, 19, 26, 2, 29, 11, 5, 14, 26, 34, 21, 20, 30}.

22. Realiza una versi´on del algoritmo Mergesort que divida el vector en tres partes iguales resolviendo recursivamente cada una de ellas. Para ello, deber´as escribir otro algoritmo de mezcla que act´ue sobre tres subsecuencias ordenadas. Comp´aralo con la versi´on estudiada. ¿Qu´e coste asint´otico tiene?

23. Realiza una traza del algoritmo de partici´on que utiliza Quicksort, al aplicarlo sobre el vector A

= {21, 27, 17, 5, 20, 8, 7, 4, 19, 2, 6, 29}.

24. ¿Qu´e valor de q devuelve el algoritmo de partici´on cuando los elementos del vector tienen el mismo valor? ¿Y cuando el elemento escogido como pivote es el segundo menor del vector? Compru´ebalo con el vector A = {7, 31, 36, 5, 22, 15, 10}. ¿Qu´e talla tienen los subvectores que se generan en esta partici´on?

25. Modifica el algoritmo Mergesort para que admita los elementos a ordenar como una lista enlazada en lugar de un vector. Estudia el coste temporal y comp´aralo con la versi´on que utiliza el vector.

26. Estudia la correcci´on del algoritmo Mergesort utilizando el principio de inducci´on.

Pista: inducci´on sobre el n´umero de elementos de cada llamada.

27. Realiza una traza del algoritmo Quicksort al aplicarlo sobre el vector A = {23, 43, 11, 5, 9, 22, 15, 17, 5, 32, 29, 30, 12}.

28. Realiza una traza del algoritmo Quicksort sobre el vector A = {45, 40, 38, 33, 31, 22, 10, 5, 2, 1}.

¿Qu´e ocurre con el coste temporal cuando el vector est´a ordenado, como en este caso, de forma decreciente (sin repeticiones)? ¿Est´a en el caso mejor o peor?

29. ¿Qu´e coste tiene el algoritmo Quicksort cuando todos los elementos del vector son iguales? ¿Est´a en el caso mejor o peor?

(6)

30. Escribe una versi´on iterativa del algoritmo Quicksort que haga uso expl´ıcito de la pila de proble- mas.

Soluci´on: v´ease [Sed98, p´ag. 314].

31. Escribe una versi´on del algoritmo Quicksort que elimine una de las dos llamadas recursivas sustituyendo el “if” por un “while”. Adem´as, si se llama recursivamente sobre el subvector de mayor tama˜no se puede probar que incluso en el caso peor la profundidad de la pila crece de manera logar´ıtmica con el n´umero de elementos a ordenar. Haz que la llamada recursiva se realice sobre el subvector de mayor tama˜no.

32. Modifica el algoritmo de Select de forma que la recursi´on acabe cuando la talla del subvector est´e por debajo de un cierto l´ımite, orden´andolo entonces y buscando el k-´esimo menor elemento.

33. Realiza las mejoras propuestas para el algoritmo Quicksort y estudia emp´ıricamente el compor- tamiento del algoritmo para cada una de ellas.

34. Realiza una traza del algoritmo Select sabiendo que la llamada inicial a la funci´on es Select (A,15,8) y el vector es A = {22, 31, 19, 37, 25, 28, 3, 10, 35, 38, 44, 24, 13, 16, 8}.

35. Realiza una traza del algoritmo Select para obtener el elemento mayor del vector: A = {3, 7, 12, 22, 27, 29}. ¿Qu´e ocurre con el coste temporal cuando el vector est´a ordenado de forma creciente (sin repeticiones), y buscamos el mayor elemento del vector? ¿Est´a en el caso mejor o peor? ¿Ocurre lo mismo si el vector est´a ordenado de forma decreciente (sin repeticiones) y buscamos el elemento menor?

36. Dise˜na un algoritmo con la t´ecnica Divide y vencer´as para obtener la altura de un ´arbol binario.

Discute c´ual es el coste de la operaci´on seg´un el n´umero de nodos del ´arbol.

Pista: la altura de un nodo ser´a 1 m´as el m´aximo entre las alturas de los ´arboles que parten de su hijo izquierdo y su hijo derecho.

37. Dise˜na un algoritmo con la t´ecnica Divide y vencer´as para obtener el k-´esimo menor elemento en un ´arbol binario de b´usqueda en los dos casos siguientes:

Cuando cada nodo dispone de un atributo adicional que indica el tama˜no del sub´arbol cuya ra´ız es dicho nodo. En tal caso debes tambi´en indicar c´omo es el m´etodo de inserci´on en el

´arbol para que se cambie adecuadamente dicho atributo.

Cuando no se dispone del atributo mencionado en el punto anterior.

Discute c´ual es el coste de la operaci´on seg´un el n´umero de nodos del ´arbol, para cada uno de los dos casos.

38.

Se desea obtener los k1-´esimo, k2-´esimo, . . . , km-´esimo menores elementos de un vector de talla n. Dise˜na un algoritmo que aproveche de la mejor manera las operaciones Partition realizadas por el algoritmo Select durante las m b´usquedas para aprovechar las particiones realizadas durante la usqueda de un valor en las b´usquedas posteriores.

Pista: almacenar las posiciones que devuelve partition en un ´arbol binario de b´usqueda.

39.

Queremos extraer los menores elementos de un vector. Es decir, deseamos disponer de una cola de prioridad donde ´unicamente vamos a extraer valores una vez creada la cola a partir de un vector. Para ello podemos utilizar un minheap, pero tambi´en podemos utilizar una variante del algoritmo Quicksort que vaya realizando las operaciones Partition sobre el subvector izquierdo hasta llegar a obtener el menor elemento deseado. Cuando necesitemos extraer nuevos elementos

(7)

realizamos la misma operaci´on, para ello podemos guardar las posiciones que devuelve Partition en una pila.

40. Sea T [1..n] un vector ordenado de enteros diferentes (negativos y positivos). Dise˜na un algoritmo Divide y vencer´as que encuentre un i tal que 1 ≤ i ≤ n y T [i] = i siempre que este i exista. El algoritmo debe tener un coste O(log n).

Pista: similar a la b´usqueda binaria.

41. Dado un conjunto S de reales y un real x, dise˜na un algoritmo con un coste temporal Θ(n log n) basado en el esquema Divide y vencer´as que diga si existen o no dos elementos de S que sumen exactamente x.

Pista: f´ıjate en la ordenaci´on que hace el algoritmo Mergesort.

42. Disponemos de un conjunto T de n tornillos, con n ≥ 1, de tama˜nos diferentes y un conjunto R de n tuercas de tama˜nos tambi´en diferentes. Cada tornillo encaja exactamente en una tuerca. Se desea emparejar cada tornillo con su tuerca correspondiente, teniendo en cuenta que no se pueden comparar los tornillos entre s´ı, ni las tuercas entre s´ı.

Dise˜na un algoritmo Divide y vencer´as para resolver el problema. Puedes utilizar la siguiente funci´on:

tipo

vectorT = vector [1..n] de tornillo;

vectorR = vector [1..n] de rosca;

...

funci´on enrosca (t : tornillo; r : rosca): entero;

/* < es una relaci´on de orden definida entre tornillos y roscas */

opci´on

t < r : devuelve -1; /* t no cabe en r */

t = r : devuelve 0; /* t se enrosca en r */

t > r : devuelve +1; /* r es demasiado grande para t */

fin_opci´on fin_funci´on

El coste temporal de esta funci´on es O(1).

Estudia la complejidad temporal del algoritmo dise˜nado en los casos mejor y peor, justific´andola adecuadamente. Identifica las instancias del problema que corresponden a estos casos.

Sugerencia: Se puede utilizar una estrategia de resoluci´on similar a la del algoritmo de Quicksort.

43. Dado un conjunto de n valores enteros C = {v1, v2, . . . , vn} se desea obtener la m´ınima distancia entre dos valores cualesquiera de este conjunto. Si llamamos m´ın(vi, C) a minim{|vi− vj|/1 ≤ j ≤ n, j 6= i}, una posible funci´on que obtenga este valor ser´ıa:

minima distancia({v1, v2, . . . , vn})

= minim(m´ın(v1, {v2, . . . , vn}), minima distancia({v2, . . . , vn})) n > 2 y estando la minima distancia en un conjunto de dos valores la distancia entre los dos.

¿C´ual es el coste de una rutina que calcule m´ın(v, C) para un conjunto C de talla n?

¿C´ual es el coste de la funci´on minima distancia definida anteriormente, suponiendo que el c´alculo de m´ın(v, C) es lineal con la talla n de C?

¿Se puede encontrar una descomposici´on del problema tal que, en al menos alguna instancia, mejore el comportamiento temporal?

Pista: recuerda el algoritmo de partici´on de Quicksort.

(8)

Arboles ´

44. Si la acci´on P fuera escribir la etiqueta del nodo, indica en qu´e orden se escribir´ıan cada una de las etiquetas del siguiente ´arbol, para cada uno de los recorridos: preorden, postorden y por niveles

Q R S A

C D

B

G F E

K I J H O P T

M N L

Figura 2: Representaci´on de un ´arbol.

45. Para el ´arbol de la figura 2, responde a la siguientes cuestiones:

1. Altura y grado del ´arbol.

2. Antecesores, descendientes, antecesores propios, descendientes propios, antecesores directos y descendientes directos del nodo N .

3. ¿En qu´e nivel se encuentra el nodo R?

4. Profundidad y altura del nodo P ; ¿y del nodo C?

46. Para adoptar la representaci´on de ´arboles mediante “lista de hijos”, se propone la siguiente definici´on en C++:

1 struct e l e m _ l i s t a {

2 int indice ;

3 e l e m _ l i s t a * s i g u i e n t e ;

4 };

5 struct n o d o _ a r b o l {

6 // aqu´ı p o d r ´ı a m o s a~nadir otra i n f o r m a c i ´o n s a t ´e l i t e

7 e l e m _ l i s t a * l i s t a _ h i j o s ;

8 };

9 class a r b o l _ l h {

10 int n u m _ n o d o s ;

11 n o d o _ a r b o l * l o s _ n o d o s ; // vector de nodos

12 int raiz ; // ´ındice del nodo ra´ız en el vector

13 public:

14 a r b o l _ l h (int num ); // c o n s t r u c t o r

15 void p r e o r d e n (); // e j e r c i c i o

16 void p o s t o r d e n (); // e j e r c i c i o

17 int altura (); // e j e r c i c i o

18 void i n s e r t a r _ h i j o (int hijo , int padre ); // e j e r c i c i o

19 void p o n e r _ v a l o r (int nodo , int valor ); // e j e r c i c i o

20 };

(9)

21 a r b o l _ l h :: a r b o l _ l h (int num ) { // c o n s t r u c t o r

22 n u m _ n o d o s = num ; l o s _ n o d o s = new n o d o _ a r b o l [ n u m _ n o d o s ];

23 raiz = -1; // para i n d i c a r que el ´arbol est´a vac´ıo

24 for (int i =0; i < n u m _ n o d o s ; i ++) l o s _ n o d o s [ i ]. l i s t a _ h i j o s = 0;

25 }

Resolver las siguientes cuestiones:

1. Escribir una funci´on recursiva con el perfil:

void nodo_lh::preorden();

que imprima los ´ındices de los nodos en preorden.

2. Escribir una funci´on recursiva con el perfil:

void nodo_lh::postorden();

que imprima los ´ındices de los nodos en postorden.

3. Escribir una funci´on recursiva con el perfil:

int nodo_lh::altura()

que determine la altura del ´arbol. ¿Qu´e coste temporal tiene el algoritmo?

4. Escribir una funci´on con el perfil:

void insertar_hijo(int hijo, int padre);

que inserte un nuevo nodo en el ´arbol, de forma que el nuevo nodo de ´ındice hijo sea hijo del nodo de ´ındice padre; si el nodo padre ya ten´ıa hijos, la inserci´on se realizar´a lo m´as a la derecha posible. Asumiremos que la inserci´on del nodo ra´ız s´olo se realiza cuando el

´arbol est´a vac´ıo, y se indicar´a pasando a la funci´on como valor del argumento padre un −1.

¿Qu´e coste temporal tiene el algoritmo? ¿Qu´e coste tendr´ıa si la inserci´on del nuevo nodo se hiciera lo m´as a la izquierda posible?

47. Para adoptar la representaci´on de ´arboles mediante “hijo m´as a la izquierda – hermano derecho”, se propone:

1 class n o d o _ h i h d {

2 public:

3 int valor ;

4 n o d o _ h i h d * h i j o _ i z q d o ;

5 n o d o _ h i h d * h e r m a n o _ d c h o ;

6 };

7 class a r b o l _ h i h d {

8 n o d o _ h i h d * raiz ;

9 public:

10 // e j e r c i c i o

11 };

Resolver las siguientes cuestiones:

1. Escribir un m´etodo con el perfil:

void arbol_hihd::preorden();

(10)

que imprima los valores de los nodos en preorden.

2. Escribir un m´etodo con el perfil:

void arbol_hihd::postorden();

que imprima los valores de los nodos en postorden.

3. Escribir un m´etodo con el perfil:

int arbol_hihd::hojas();

que imprima los valores de los nodos que son hojas, siguiendo un orden de izquierda a derecha. Adem´as la funci´on debe devolver el n´umero de nodos que son hojas.

4. Escribir un m´etodo con el perfil:

int arbol_hihd::hojas_reverse();

que imprima los ´ındices de los nodos que son hojas, siguiendo un orden de derecha a izquierda.

Adem´as la funci´on debe devolver el n´umero de nodos que son hojas. Se recomienda utilizar una pila para poder realizar el recorrido de los sub´arboles de derecha a izquierda.

48. Para adoptar la representaci´on de ´arboles binarios mediante variables din´amicas, se propone:

1 class n o d o _ a b {

2 public:

3 int valor ;

4 n o d o _ a b * hizq , * hder ;

5 };

6 class a r b o l _ a b {

7 n o d o _ a b * raiz ;

8 public:

9 // c a b e c e r a s m ´e t o d o s del e j e r c i c i o ...

10 };

Resolver las siguientes cuestiones:

1. Escribir un m´etodo con el perfil:

void arbol_ab::preorden();

que imprima los valores de los nodos en preorden.

2. Escribir un m´etodo con el perfil:

void arbol_ab::inorden();

que imprima los valores de los nodos en inorden.

3. Escribir un m´etodo con el perfil:

void arbol_ab::postorden();

que imprima los valores de los nodos en postorden.

4. Escribir un m´etodo con el perfil:

(11)

int arbol_ab::altura();

que determine la altura del ´arbol binario. ¿Cu´al ser´a el coste temporal del algoritmo?

5. Escribir un m´etodo con el perfil:

void arbol_ab::espejo();

que intercambie los hijos izquierdo y derecho de cada nodo. ¿Cu´al ser´a el coste temporal del algoritmo?

6. Escribir un m´etodo con el perfil

nodo_ab* arbol_ab::buscar(int n);

que devuelva un puntero al nodo de valor n del ´arbol binario. Si el nodo de valor n no se encuentra en el ´arbol, la funci´on devolver´a NULL. Esta funci´on puede verse como una funci´on que devuelve un puntero al sub´arbol cuya ra´ız es el nodo n. ¿Cu´al ser´a el coste temporal del algoritmo?

7. Suponiendo que ya hemos obtenido la funci´on buscar de la cuesti´on anterior, utilizarla para escribir una funci´on recursiva con el perfil:

void arbol_ab::interseccion(arbol_ab *otro)

que imprima los valores de los nodos que son el resultado de obtener la intersecci´on del ´arbol binarios con otro; es decir, los ´ındices de los nodos que pertenecen, a la vez, al propio ´arbol y a otro. ¿Cu´al ser´a el coste temporal del algoritmo?

8. Suponiendo que ya hemos obtenido la funci´on buscar de la cuesti´on anterior, utilizarla para escribir un m´etodo con el perfil:

void arbol_ab::diferencia(arbol_ab *otro)

que imprima los ´ındices de los nodos que son el resultado de obtener la diferencia del propio

´arbol con respecto a otro; es decir, los ´ındices de los nodos que pertenecen al propio ´arbol y no pertenecen a otro. ¿Cu´al ser´a el coste temporal del algoritmo?

9. Escribir un m´etodo con el perfil:

nodo_ab* arbol_ab::maximo();

que devuelva un puntero al nodo cuyo valor es el m´aximo del ´arbol binario. ¿Cu´al ser´a el coste temporal del algoritmo?

10. Escribir un m´etodo con el perfil:

nodo_ab* arbol_ab::predecesor(int n);

que devuelva un puntero al nodo del ´arbol binario T cuyo valor es el inmediatamente inferior a n. Si no existe ning´un valor en el ´arbol que sea menor que el ´ındice dado, la funci´on devolver´a el valor NULL.

(12)

Grafos

49. El cuadrado de un grafo dirigido G = (V , E) se define como G2= (V ,E0) tal que (u,w) ∈ E0 si y solo si para alg´un v ∈ V se cumple que (u,v) ∈ E y (v,w) ∈ E en el grafo G. Escribe un algoritmo para calcular G2a partir de G, suponiendo que este ´ultimo est´a representado mediante una matriz de adyacencia. Calcula el coste temporal del algoritmo resultante, justific´andolo adecuadamente.

50. Dados dos grafos G1 = (V1,E1) y G2 = (V2,E2), con V1 = V2, se desea obtener un nuevo grafo G = (V , E) que sea la diferencia sim´etrica de G1 y G2, tal que se cumpla que V = V1 = V2, y el conjunto de aristas E contenga las aristas de E1 que no est´en en E2, junto con las de E2

que no est´en en E1. Escribe un algoritmo que construya el grafo resultante G, suponiendo que los grafos est´an representados mediante matrices de adyacencia. Analiza el coste espacial y temporal del algoritmo.

51. El grafo traspuesto de un grafo dirigido G = (V , E) es un grafo Gt=(V ,Et) donde (u,v) ∈ Etsi y solo si (v,u) ∈ E. Escribe dos algoritmos que permitan construir el grafo traspuesto Gta partir de otro grafo G: en el primer algoritmo los grafos se representar´an mediante matrices de adyacencia, mientras que en el segundo algoritmo los grafos se representar´an mediante listas de adyacencia.

Calcula el coste temporal de los dos algoritmos.

52. Se dice que un grafo G = (V , E) es bipartido si:

Existen un par de conjuntos V1,V2 tales que V es la uni´on de V1 y V2, y la intersecci´on de V1 y V2 es vac´ıa.

Para todo arco (u,v) de E, u est´a en V1, y v est´a en V2.

Se debe escribir un algoritmo que diga si un grafo G, del que se supone que sus v´ertices est´an numerados de 1 a n, es bipartido:

1. En el caso de que G est´e representado por una matriz de adyacencia.

2. En el caso de que G est´e representado mediante listas de adyacencia.

Estima el coste temporal de ambos algoritmos.

53. Supongamos que tenemos un grafo dirigido sin bucles G = (V, A) (donde V es el conjunto de v´ertices, numerados de 1 a |V |, y A es el conjunto de aristas, numeradas de 1 a |A|) representado en una matriz M de dimensiones |V | × |A|, donde:

mij= 1 si del v´ertice i parte la arista j, mij= −1 si al v´ertice i llega la arista j, mij= 0 la arista j no incide en el v´ertice i.

1 2

3

1 2 4

3

M =

0 −1 1 −1

−1 1 −1 0

1 0 0 1

1 2

3 2 1

NIL

2

NIL

1

NIL

(13)

Escribe dos algoritmos para pasar de esta forma de representaci´on a una representaci´on en forma de lista de adyacencia y de matriz de adyacencia. Calcula el coste de los algoritmos justi- fic´andolo adecuadamente.

54. Sea G = (V ,E) un grafo no dirigido con n > 0 nodos. Dado que la relaci´on “ser dos nodos mutuamente conectados” es reflexiva, sim´etrica y transitiva, se pueden calcular las componentes conexas de un grafo no dirigido utilizando un MF-Set de la siguiente forma:

1. Se inicializa el MF-Set con n subconjuntos disjuntos: cada uno de los subconjuntos con- tiene un v´ertice del grafo. Esto indicar´a que, inicialmente, los v´ertices del grafo son inal- canzables entre s´ı. Para crear los n subconjuntos iniciales, se puede utilizar la operaci´on Crear subconjunto(x), la cual crea un subconjunto que contiene un ´unico elemento: x. El coste de esta operaci´on es O(1). ¿Qu´e acciones habr´ıa que llevar a cabo para realizar esta operaci´on?

2. Para cada arco (u,v) ∈ E, si u y v pertenecen a subconjuntos disjuntos, se unen los subcon- juntos disjuntos a los que pertenecen u y v.

Cuando el algoritmo finalice, cada una de las componentes conexas que contenga el grafo G es- tar´a representada mediante un subconjunto disjunto. Y cada subconjunto disjunto contendr´a aque- llos v´ertices que pertenecen a la misma componente conexa.

Escribir un algoritmo que siguiendo esta estrategia determine si un grafo no dirigido es conexo.

Supondremos que el grafo se representa mediante una matriz de adyacencia. Estudia cu´al ser´ıa el coste temporal del algoritmo si las operaciones union y buscar se realizan aplicando los heur´ısticos uni´on por rango y compresi´on de caminos. ¿Cu´al ser´ıa su coste temporal si la representaci´on fuera mediante listas de adyacencia?

55. Haz una traza del algoritmo de recorrido de un grafo primero en profundidad para cada uno de los grafos que se muestran a continuaci´on. Para hacer la traza se recomienda, previamente, representar la estructura del grafo mediante listas de adyacencia. El recorrido se inicia desde el v´ertice 1.

5 2

7

3 4

1 6

1 2

4 5

3

6

56. ¿Qu´e coste temporal tendr´ıa el algoritmo de recorrido primero en profundidad si la representaci´on del grafo se hiciese utilizando una matriz de adyacencia?

57. Dado un grafo G no dirigido, ponderado y conexo, modifica el algoritmo de recorrido primero en profundidad para que devuelva las aristas que formar´ıan parte de un ´arbol de expansi´on para el grafo G. ¿Ser´ıa ese ´arbol de expansi´on de coste m´ınimo? Razona la respuesta.

58. Realiza una traza del algoritmo que obtiene la ordenaci´on topol´ogica de los v´ertices de un grafo dirigido y ac´ıclico, para el grafo de la figura, iniciando el recorrido en profundidad desde el nodo 1.

Para hacer la traza se recomienda, previamente, representar la estructura del grafo mediante listas de adyacencia. Una vez obtenido el orden topol´ogico de los v´ertices, muestra c´omo quedar´ıa el grafo si coloc´asemos en una l´ınea horizontal, de izquierda a derecha los v´ertices del grafo siguiendo el orden obtenido. ¿En qu´e sentido van todas las aristas del grafo? ¿Por qu´e?

2 3

8 6

4

5 7

1

1

6

2 2

6

9

4 3

6 2 1

3 3

2 1

4 3 1

10 11

2 3 4 2

(14)

59. Realiza una traza del algoritmo de Kruskal para los grafos de las siguientes figuras:

1

5

2 3 4

6

6 5

5 5

1

3

6 4 2 6

2 3

8 6

4

7 1

4

1

8 7

9

5

2

7

2 4 8

6 14 11

9

10

2 3

8 6

4

7 1

4

4

3 10

9

5

2

6

1

8

5 11

4 14 14

14 1

2 3 11

7

10

60. Utilizando el algoritmo de Kruskal, ¿c´omo se podr´ıa determinar si un grafo es conexo? ¿c´omo se podr´ıan obtener los v´ertices que forman cada una de las componentes conexas del grafo?

61. Supongamos que hemos obtenido un ´arbol de expansi´on de coste m´ınimo de un grafo G no dirigido, conexo y ponderado. Si, a continuaci´on se a˜nadiera un nuevo v´ertice al grafo G a˜nadiendo, para ello, nuevas aristas, ¿De qu´e forma se podr´ıa actualizar el ´arbol de expansi´on de coste m´ınimo m´as r´apidamente?

62. Haz una traza del algoritmo de Dijkstra para los siguientes grafos, tomando como v´ertice origen el 1. Una vez obtenida la soluci´on, recupera la secuencia de v´ertices que forman cada uno de los caminos m´as cortos, utilizando, para ello, el vector P que utiliza el algoritmo para almacenar los predecesores.

PSfrag replacements

1 2

4 3 5 5

6 7 8 9

10 12 10 15

20 30

50 50

100

6

PSfrag replacements

2 1 3

4 5

6

8 7

9

10 10

12 15

20 30 50

100 6

PSfrag replacements

1 1

2

2 2

2 3 2

3 4

4 5

6 7 8 9

10 12 15 20 30 50 100

6 6

PSfrag replacements

1 2

2 2

3 3 3

4 5 4

5 6

7 8

9 10

12 15 20 30 50 100

6

63. Haz una traza del algoritmo de Dijkstra para los siguientes grafos, tomando como v´ertice origen el 3.

Observa cu´al es la diferencia que existe en ambos grafos. Al calcular los caminos m´as cortos desde el v´ertice 3 en el grafo (b), ¿qu´e habremos obtenido respecto al primer grafo?

(15)

Estructuras de Datos y Algoritmos (FI-UPV) – Curso 2004–05 14

1 2

3

4 5

5 5 5

5 6

7 8 9

10

10

10 12 15

20

20

30 40

50 100

6

(a)

1 2

3

4 5

5 5 5

5 6

7 8 9

10

10

10 12 15

20

20

30 40

50 100

6

(b)

64. Muestra un ejemplo sencillo de un grafo dirigido con pesos negativos en los arcos, para el que el algoritmo de Dijkstra producir´ıa una soluci´on err´onea. ¿Por qu´e no puede asegurarse que si existen pesos negativos en los arcos del grafo el algoritmo de Dijkstra resuelva correctamente el problema? ¿Podr´ıa darse alg´un caso en el que, aunque el grafo contuviera pesos negativos, la soluci´on obtenida por Dijkstra fuera la correcta? Si es as´ı da alg´un ejemplo.

65. Sup´ongase que se modifica la condici´on del bucle mientras del algoritmo de Dijkstra: mientras Q 6= ∅ por mientras |Q| > 1. Esta modificaci´on provocar´ıa que el bucle se repitiera |V | − 1 veces en lugar de |V | veces. ¿Puede afirmarse que el algoritmo modificado resolver´ıa igualmente el problema? ¿Por qu´e?

66. Dado un grafo dirigido G = (V , E) ponderado con pesos no negativos en las aristas mediante una funci´on de ponderaci´on w, modifica el algoritmo de Dijkstra para que devuelva como resultado los costes de los caminos m´ınimos entre cualquier par de nodos del grafo. ¿Cu´al ser´ıa el coste temporal del algoritmo? Raz´onalo adecuadamente.

67. ¿C´omo podr´ıa comprobarse si un grafo dirigido es fuertemente conexo utilizando el algoritmo de Dijkstra? Comenta qu´e modificaciones ser´ıan necesarias realizar sobre el algoritmo.

68. ¿Qu´e coste temporal tendr´ıa el algoritmo de Dijkstra si el grafo estuviera representado mediante una matriz de adyacencia? Razona la respuesta adecuadamente.

69. Modifica el algoritmo de Dijkstra para que, adem´as, contabilice para cada v´ertice v ∈ V , el umero de caminos m´ınimos que existen desde el origen a v.

70. Explica c´omo modificar el algoritmo de Dijkstra para que si hay m´as de un camino m´ınimo del origen s a un v´ertice v ∈ V , se escoja el camino con el menor n´umero de aristas.

(16)

Ramificaci´ on y Poda

71. Se desea asignar n tareas a n agentes, de forma que cada agente realice exactamente una tarea.

Si al agente a se le asigna la tarea t, entonces el coste de realizar esa tarea es c[a, t]. El problema consiste en encontrar una asignaci´on de tareas que minimice el coste total de ejecutar las n tareas.

1. Describir brevemente los componentes (estructura de un estado o nodo, y las funciones de ramificaci´on y cota optimista) de un algoritmo de Ramificaci´on y Poda que resuelva el problema propuesto.

2. Escribir la traza de un algoritmo de Ramificaci´on y Poda para una instancia en la que n = 4 y la matriz c viene dada por:

a \ t 1 2 3 4

1 11 12 18 40

2 14 15 13 22

3 11 17 19 23

4 17 14 20 28

Donde las filas son los agentes y las columnas las tareas. Por ejemplo c[2, 3] = 13 indica que el coste de realizar la tarea 3 por el agente 2 es 13.

3. ¿Qu´e modificaciones habr´ıa que hacer al algoritmo de Ramificaci´on y Poda para devuelva todas las soluciones ´optimas?

72. Dado un entero positivo N se define un K-partici´on de N como una sucesi´on de K enteros positivos diferentes cuya suma sea N . Ejemplo: Para N = 13 y K = 4 algunas particiones posibles son: 13 = 6 + 4 + 2 + 1; 13 = 5 + 4 + 3 + 1; . . .

Sea ΠN,K el conjunto de todas las K-particiones de N , y sea p(x) el producto de los elementos de una K-partici´on x ∈ ΠN,K. Haciendo uso de la propiedad

µ N K

K

≥ p(x)

dise˜na un algoritmo de Ramificaci´on y Poda tal que, dados N y K, determine una K-partici´on de N que maximice el producto de sus elementos; es decir, que obtenga:

x?= argmax

x∈ΠN,K

(p(x)) .

73. Un promotor musical pretende organizar un macroconcierto con grupos de varios pa´ıses europeos de forma que act´ue un grupo de cada pa´ıs. Sea G = {1, 2, . . . , N } el conjunto de grupos disponibles y sea P = {1, 2, . . . , P } el conjunto de pa´ıses. La funci´on p(g) = j nos indica que el grupo g ∈ G es del pa´ıs j ∈ P.

El promotor dispone de un presupuesto m´aximo de M millones de EUROs. Debido a la rivalidad existente entre los grupos, cada grupo cobra una cantidad de dinero que es funci´on del orden en que act´ue, dado por la funci´on c(g, i), que nos proporciona el coste (en millones de EUROs) de la actuaci´on del grupo g ∈ G en la posici´on i-´esima, i > 0.

Una posible cota optimista para este problema es:

F (g1g2· · · gk) = X

1≤i≤k

c(gi, i) + X

k+1≤i≤P

c0(i),

donde

(17)

(g1g2· · · gk) es un estado (nodo o soluci´on parcial), de forma que gi ∈ G representa que el grupo gi act´ua en la posici´on i-´esima.

c0(i) es el coste m´as barato de cualquier grupo que act´ue en la i-´esima posici´on (indepen- dientemente del pa´ıs al que pertenezca) y se puede calcular como:

c0(i) = m´ın

g∈Gc(g, i).

Realiza una traza de un algoritmo de Ramificaci´on y Podaque minimice el presupuesto del concierto para la siguiente instancia:

M = 30;

P = 4, P = {1, 2, 3, 4};

N = 6, G = {1, 2, 3, 4, 5, 6};

Pa´ıs de cada grupo: p : G → P

g 1 2 3 4 5 6

p(g) 1 2 2 3 4 4

Coste de cada grupo en cada posici´on: c : G × {1, 2, . . . , P } → N>0 g

i 1 2 3 4 5 6

1 5 10 20 10 10 3

2 10 5 40 10 10 10

3 15 5 20 10 5 15

4 10 10 10 10 10 15

Asume que la ramificaci´on se realiza por “primero el mejor” y, en caso de empate, se ramifica el estado que se encuentre en un nivel del ´arbol m´as cercano a las soluciones. Responde a las siguientes cuestiones sobre la traza resultante:

1. ¿Cu´al es la soluci´on obtenida y el coste del macroconcierto?

2. ¿Cu´al es la complejidad espacial de un estado de la lista de estados activos?

3. ¿Cu´antas iteraciones del algoritmo has necesitado para encontrar una soluci´on ´optima?

4. ¿Cu´al es la complejidad temporal de la funci´on de ramificaci´on que has utilizado?

5. ¿Cu´antos estados han sido insertados en la lista de estados activos (o lista de nodos vivos)?

6. ¿Cu´al es la complejidad temporal del c´alculo de la cota optimista en un estado?

74. Dada una matriz M de k filas por k columnas, se dice que una k-tupla de posiciones de M , t =< (i1, j1), (i2, j2), ...., (ik, jk) >

es una “Configuraci´on Libre de interAtaque Torre (CLAT)” si im6= in, jm6= jn, ∀m, n | m 6= n y 1 ≤ m, n ≤ k.

Sea S(t) la suma de las k componentes indicadas por la tupla t S(t) = M [i1, j1] + M [i2, j2] + .... + M [ik, jk] y sea TM el conjunto de las CLAT de M .

(18)

Desarrollar un algoritmo de Ramificaci´on y Poda que encuentre una k-tupla t? de M cuya suma de componentes sea m´axima, es decir,

t? = argmax

∀t∈TM

S(t)

Para el desarrollo de una cota superior puede hacerse uso de la siguiente propiedad v´alida para toda matriz Q de q filas por q columnas:

m´ax∀t S(t) ≤ m´ın

q

X

i=1

j=1..qm´axQij,

q

X

j=1

i=1..qm´axQij

Ejemplo:

1 22 23 19 18

2 9 3 15 20

14 4 5 8 17

12 10 7 6 24

11 13 21 20 25

Una CLAT t es: t =< (1, 1), (2, 3), (3, 2), (4, 4), (5, 5) >, con S(t) = 39.

Otra CLAT mejor es t0=< (1, 2), (2, 4), (3, 1), (4, 5), (5, 3) >, con S(t0) = 96.

Representar el ´arbol de estados correspondiente a la ejecuci´on del algoritmo para la instancia del ejemplo, indicando en cada nodo la soluci´on parcial y el valor de la cota correspondientes.

Explicar brevemente los c´alculos realizados.

75. Para construir un artefacto hay que ensamblar M piezas. Se sabe que el coste de ensamblar la pieza i, c[i, j], depende del n´umero de piezas j ya ensambladas anteriormente, 1 ≤ i ≤ M, 0 ≤ j ≤ M −1.

Desarrollar un algoritmo de Ramificaci´on y Poda que establezca el orden de ensamblado de m´ınimo coste. Realizar una traza del algoritmo para M = 3 y la siguiente instancia de c.

i/j 0 1 2

1 3 2 1

2 3 3 2

3 4 4 3

76. Sea G = hV, Ei un grafo dirigido ponderado por la funci´on p : E → R+, y sean v0, vf ∈ V dos v´ertices dados. Sea A un algoritmo de Ramificaci´on y Poda que encuentra el camino simple (no se repiten nodos) de mayor peso que va desde v0a vf. Para ello, A emplea una funci´on cota optimista que se basa en el hecho de que si queremos ir de un v´ertice i a un v´ertice cualquiera j 6= i, visitando

´

unicamente v´ertices de un conjunto C ⊂ V, i, j /∈ C, se tiene que el camino simple de mayor peso que va desde i a j es siempre de longitud no mayor que

X

v∈C∪{i}

w∈C∪{j}m´ax p(v, w)

Suponiendo que A emplea la estrategia “Primero el mejor”, desarrollar una traza de A para la instancia que se da en la siguiente figura al buscar el camino simple de mayor peso que va desde v0= 1 a vf = 5.

1 2 3 4 5

1 - 2 2 10 -

2 - - 6 - 4

3 - - - 3 4

4 2 - - - 3

5 - - 2 - -

(19)

77. Escribir un algoritmo de Ramificaci´on y Poda que, dado un grafo no dirigido G = hV, Ai (con pesos en los arcos), encuentre una partici´on de V en dos subconjuntos V1y V2(V = V1∪ V2; V1∩ V2= ∅) tales que P

a∈V1,b∈V2

p(a, b) sea m´axima, siendo p : V × V → Z+ la funci´on de ponderaci´on de los arcos.

78. Dado un conjunto finito A, y S(a) ∈ Z+, ∀a ∈ A, desarrollar un algoritmo de Ramificaci´on y Poda que encuentre la partici´on de A en k subconjuntos disjuntos (A1, A2, ...Ak,

k

S

i=1

Ai = A, Ai 6= ∅) que minimice

k

X

i=1

à X

a∈Ai

S(a)

!2

Nota: puede utilizarse la siguiente propiedad sin demostraci´on

k

X

i=1

à X

a∈Ai

S(a)

!2

≥ |A|(m´ın

a∈AS(a))2

79. Dado un conjunto finito P de puntos en el plano y dos puntos p1, pF ∈ P , se pide dise˜nar un algoritmo de Ramificaci´on y Poda que calcule el camino m´as corto entre p1 y pF que pase por todos los puntos de P una sola vez. La distancia entre dos puntos es la eucl´ıdea. La cota inferior empleada en el algoritmo debe calcularse en tiempo O(1).

80. Se quiere abonar M campos con N sacos de abono. La utilizaci´on de i sacos en el campo j permite obtener una cosecha cuyo valor es vij.

Desarrollar un algoritmo de Ramificaci´on y Poda que determine cu´antos sacos hay que utilizar en cada campo para obtener una cosecha de valor m´aximo.

81. Una agencia gestiona la ficha de n proveedores y n clientes. Cada proveedor ha consultado el expediente de todos los clientes y ha manifestado su inter´es por suministrarle servicios mediante sendas puntuaciones de 0 a 10. El inter´es manifestado por el proveedor i en el cliente j se ha almacenado en p interes[i, j]. Tambi´en los clientes han expresado su inter´es por ser atendidos por cada uno de los proveedores. En c interes[i, j] se ha almacenado el inter´es (tambi´en de 0 a 10) manifestado por el cliente i en ser atendido por el proveedor j. La agencia desea asignar un

´

unico proveedor a cada cliente y un ´unico cliente a cada proveedor de modo que la “satisfacci´on”

obtenida por ellos sea m´axima. Entendemos por “satisfacci´on” del par formado por el proveedor i y el cliente j la suma de sus intereses mutuos, es decir, p interes[i, j] + c interes[j, i].

Escribir un algoritmo de Ramificaci´on y Poda que asigne ´optimamente a cada proveedor un

´

unico cliente y viceversa.

82. Para transportar M cajas, cada una de ellas de un peso pj y un valor vj, 1 ≤ j ≤ M , se dispone de N camiones, cada uno de los cuales soporta un peso m´aximo ci, 1 ≤ i ≤ N . Dise˜nar un algoritmo de Ramificaci´on y Poda que proporcione el conjunto de cajas a transportar y su distribuci´on en los camiones que maximice el valor de la carga. Se supone que

M

P

j=1

pj

N

P

i=1

ci.

Estudiar la complejidad temporal del la Ramificaci´on de cada nodo de la lista de nodos vivos y la complejidad temporal de la obtenci´on de la cota optimista. Estudiar tambi´en la ocupaci´on espacial de un nodo en la lista de nodos vivos.

83. Los organizadores de un partido de un f´utbol han reservado la grada A para la afici´on del equipo visitante y la grada B para la afici´on del equipo local. Las aficiones de cada equipo est´an organi- zadas en pe˜nas, cada una de ellas con un n´umero de socios determinado. ´Unicamente se venden entradas a las pe˜nas y s´olo en el caso de que haya sitio para todos sus socios. Es decir, si se decide

(20)

vender entradas a una pe˜na, se venden entradas para todos sus socios. Por supuesto, no se pueden vender entradas de la grada A a pe˜nas del equipo local o viceversa. Se desea maximizar la venta de entradas total sabiendo, para cada una de las aficiones, el n´umero de pe˜nas y el n´umero de socios de cada una de ellas. Los datos son los siguientes:

El n´umero de entradas en la grada A es NA, y el de la B, NB.

El n´umero de pe˜nas de la afici´on del equipo visitante es PA, y el del equipo local, PB. El n´umero de socios de cada pe˜na de la afici´on del equipo visitante se denota con SAi, 1 ≤ i ≤ PA. De forma an´aloga, el n´umero de socios de cada pe˜na del equipo local es SBi, 1 ≤ i ≤ PB.

Adem´as, se sabe que no hay entradas suficientes para todas las pe˜nas del equipo visitante y del local, es decir, XPA

i=1

SAi> NA y

PB

X

i=1

SBi> NB.

Escribe un algoritmo de Ramificaci´on y Poda que resuelva el problema.

84. Una compa˜n´ıa a´erea tiene en plantilla a N pilotos y N copilotos. Se dispone de un vector de enteros P [1..N, 1..N ] tal que P [i, j] es el grado de preferencia del piloto i para el copiloto j; de la misma forma, se define C[1..N, 1..N ] tal que C[i, j] es el grado de preferencia del copiloto i para el piloto j. El peso de un emparejamiento del piloto i y el copiloto j se define como P [i, j] · C[j, i].

El problema de asignaci´on de vuelos es el problema de emparejar cada piloto con un copiloto de forma que la suma de los pesos de los emparejamientos sea m´axima.

Un ejemplo de instancia del problema con N = 4 pilotos y copilotos se muestra a continuaci´on, con las siguientes matrices de preferencia:

P C

1 2 3 4 1 2 3 4

1 2 3 1 1 1 4 1 3 2

2 1 1 4 3 2 4 2 3 1

3 1 2 3 4 3 1 1 1 4

4 2 3 2 1 4 3 2 3 3

Un ejemplo de soluci´on al problema (una posible asignaci´on de pilotos y copilotos) para esta instancia es: 1 2 3 4

1 2 3 4

PSfrag replacements Piloto:

Copiloto:

La suma de los pesos de los emparejamientos de esta soluci´on es:

P [1, 2]C[2, 1] + P [2, 4]C[4, 2] + P [3, 1]C[1, 3] + P [4, 3]C[3, 4] = 3 · 4 + 3 · 2 + 1 · 3 + 2 · 4 = 12 + 6 + 3 + 8 = 29.

a) Escribe la traza de un algoritmo de ramificaci´on y poda para la instancia presentada ante- riormente. El algoritmo de ramificaci´on y poda tendr´a las siguientes caracter´ısticas:

• Selecci´on por “primero el mejor” (utiliza la misma funci´on como cota superior y fun- ci´on de puntuaci´on de un estado). En caso de empate de la funci´on de puntuaci´on, se selecciona el estado que se encuentre a “mayor profundidad”.

• Poda expl´ıcita.

• El conjunto de estados activos se representa con un Max-Heap de punteros a estados.

• Una posible cota optimista de un estado (una asignaci´on incompleta de pilotos a copi- lotos) ser´ıa:

◦ sumar el peso de los emparejamientos ya efectuados y,

Referencias

Documento similar

Por cada nodo, sabemos comienzo y fin de su camino pesado La clave es que subiendo a la raíz hay O(lg N) aristas livianas Dentro de un camino pesado, subir k veces es restar k al

La gr´ afica 4.6 muestra un ejemplo en que un n´ umero de ´epocas fijo permite al algoritmo encontrar una soluci´ on mejor: Se puede observar como limitando el n´ umero de ´epocas

La conclusi´ on fue que para un n´ umero peque˜ no de par´ ametros (del orden de la decena), el m´ etodo simplex es hasta 4 veces m´ as r´ apido, obteniendo unos valores del m´

c) Implementar un algoritmo que indique el n´ umero total de plazas disponibles por cada destino. La soluci´ on debe incluir la definici´ on de la estructura de datos m´ as

Se dice que la Administración no está obligada a seguir sus pre- cedentes y puede, por tanto, conculcar legítimamente los principios de igualdad, seguridad jurídica y buena fe,

Petición de decisión prejudicial — Cour constitutionnelle (Bélgica) — Validez del artículo 5, apartado 2, de la Directiva 2004/113/CE del Consejo, de 13 de diciembre de 2004, por

la segunda coordenada: el n´umero de participantes que obtuvieron 5, 6 ´o 7 puntos (esencialmente “la mitad o un poco m´as” del problema).. la tercera coordenada: el n´umero

1. LAS GARANTÍAS CONSTITUCIONALES.—2. C) La reforma constitucional de 1994. D) Las tres etapas del amparo argentino. F) Las vías previas al amparo. H) La acción es judicial en