EDA – ITIS/ITIG ETSINF. UPV Curso 2010/2011. A. Casanova. Grupo 2D BOLETÍN DE PROBLEMAS Tema I.5 1. Demuéstrese por inducción sobre el número n de discos que en el algoritmo de Hanoi nunca se mueve un disco más grande sobre otro más pequeño, es decir, la secuencia de movimientos resultante cumple las reglas del juego. 2. Estúdiese el coste temporal de los siguientes métodos recursivos: a. /* Cálculo de a^n, a>0, n>=0 */ public static int potencia(int a, int n) { if (n==0) return 1; else return a*potencia(a,n-1); } b. /* Cálculo de a^n, a>0, n>=0 */ public static int potencia(int a, int n) { if (n==0) return 1; else { { int aux=potencia(a,n/2); if (n%2==0) return aux*aux; else return aux*aux*a;} } c. /* 0<=i<a.length */ public static <T extends Comparable<T>> int minimo(T[] a,int i) {if (i==a.length-1) return i; else { int posMin=minimo(a,i+1); if (a[i].compareTo(a[posMin])<0) posMin=i; return posMin;} } d. /* 0<=izq<=der<a.length */ public static <T extends Comparable<T>> int minimo(T[] a, int izq,int der) { if (izq<der){ int medio=(izq+der)/2; int min1=minimo(a,izq,medio); int min2=minimo(a,medio+1,der); if (a[min2].compareTo(a[min1])<0) return min2; 1 else return min1;} else return izq; } 3. Se tiene un array a ordenado de enteros diferentes. Se pide un algoritmo recursivo que encuentre, si existe, un índice i, 0 i<a.lenght, tal que a[i]=i, con un coste O(log n). 4. Se tiene un array a que contiene n valores reales positivos, y que se ajustan al perfil de una curva cóncava, es decir, existe un mínimo en una cierta posición k, 0≤k<n, a[0..k-1] está ordenado descendentemente y a[k+1..n-1] está ordenado ascendemente (figura 1). Se debe escribir un método recursivo eficiente que encuentre la posición k. Figura 1 5. Se debe escribir un método recursivo con el siguiente perfil public static <T extends Comparable<T>> void selDir(T[] a,int i) que ordene a[i..a.length-1] con la estrategia de selección directa. 6. La figura 2 muestra una traza completa en árbol de los argumentos de las llamadas recursivas que genera mergesort para ordenar el array {10,3,50,11,3,1,3,45,1}. Para cada llamada se ha representado el array de entrada y unas casillas en blanco que se deben completar con el estado del array a la salida de la llamada. Además, se deben numerar las llamadas por el orden en que se van generando y por el orden en que se van completando. Figura 2 EDA, ITIS/ITIG, ETSInf, UPV. A. Casanova. Grupo 2D 2 7. Dados los siguientes algoritmos de ordenación de un array a[izq..der], indíquese qué relación de recurrencia para el coste describe el comportamiento temporal de cada uno de ellos cuando se aplican sobre un array que está ordenado ascendentemente y no tiene elementos repetidos. En adelante, n denota der-izq+1. a. public static <T extends Comparable<T>> void quickSort(T[] a, int izq, int der ) { if( izq<der ) { int pos = (izq+der)/2; int i= particion(a,izq,der,pos); quickSort(a,izq,i-1); quickSort(a,i+1,der); } } en donde particion es el método (visto en clase) que toma a[pos] como pivote, lo deja en su posición, reubica a su izquierda los elementos ≤ que el pivote, y a su derecha los ≥ que el pivote. Devuelve la posición del pivote. Su coste es proporcional a n. b. private static <T extends Comparable<T>> void mergeSort(T[] a, int izq, int der) { if ( izq < der ) { int mitad = (izq+der)/2; mergeSort(a, izq, mitad); mergeSort(a, mitad+1, der); fusion (a,izq, mitad+1, der); } } en donde fusion obtiene en a[izq..der] la fusión ordenada de a[izq..mitad] y a[mitad+1..der]. Su coste es proporcional a n. c. public static void <T extends Comparable<T>> insDir(T[] a, int izq,int der) { if (izq<der) { insDir(a,izq,der-1); insertar(a[der],a,izq,der-1); } } en donde insertar inserta ordenadamente a[der] entre a[izq..der-1] dejando a[izq..der] ordenado. Su coste es proporcional a n si a[der] es menor que todos los elementos que le proceden, y de un paso de programa si es mayor o igual. 8. Se debe escribir una nueva versión del algoritmo de ordenación de un array a[izq..der], izq≤0, der<a.length, cuyos elementos sean de algún tipo E Comparable, de modo que la partición actúe con “pivote ancho”, es decir, que disponga consecutivos todos los elementos iguales al pivote x: EDA, ITIS/ITIG, ETSInf, UPV. A. Casanova. Grupo 2D 3 <x =x >x Para ello se sugiere tomar como pivote x por ejemplo el elemento a[izq], e ir avanzando la partición con el siguiente esquema izq i <x j =x k ? der >x y partiendo del estado inicial i izq x der k j ? k 9. Escríbase una versión del método recursivo de selección del k-ésimo elemento de un array visto en clase, que siga la misma estrategia eficiente, pero que evite el consumo de pila asociado a la recursión. EDA, ITIS/ITIG, ETSInf, UPV. A. Casanova. Grupo 2D 4