BOLETÍN DE PROBLEMAS

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