Metodología y Tecnología de la Programación

Anuncio
Metodología y Tecnología de la Programación
Hoja de Ejercicios 2
Bloque 2: Divide y Vencerás
1.
Un algoritmo divide y vencerás divide un problema de tamaño n en 2 subproblemas
de tamaño n-1. El algoritmo aplica una solución directa cuando n = 2, que tarda un
tiempo de 3 ms. Si el tiempo de realizar la combinación es f(n) = 1.2n ms, calcular
el tiempo de ejecución exacto del algoritmo t(n).
2.
Un programa para ordenar cadenas utiliza el método de ordenación por mezcla. La
resolución para problemas de tamaño pequeño tarda un tiempo de g(n) = 2n2,
mientras que la mezcla requiere f(n) = 10n. Calcular cuál debería ser el tamaño del
caso base para optimizar el tiempo de ejecución total t(n).
3.
Supongamos que un problema puede resolverse de forma directa en un tiempo g(n)
o bien, usando divide y vencerás, puede ser dividido en varios subproblemas de
igual tamaño, necesitando en la división y en la combinación de resultados un
tiempo f(n).
a) Demostrar que si O(f(n)) es mayor o igual que O(g(n)) entonces la solución
usando divide y vencerás es siempre peor o igual (en cuanto a orden de
complejidad) que resolver el problema usando el método directo. ¿Qué
significa lo anterior y qué consecuencias tiene en la construcción de algoritmos
con divide y vencerás?
b) Demostrar que si O(f(n)) es menor que O(g(n)), no siempre tiene que ser mejor
la solución usando divide y vencerás. Sugerencia: la demostración se puede
hacer dando un contraejemplo con valores de f(n) y g(n) adecuados.
4.
¿Qué ocurriría con la eficiencia de un algoritmo divide y vencerás si, en lugar de
utilizar un valor umbral para utilizar el algoritmo básico, se aplica la recurrencia
como máximo r veces antes de utilizar el algoritmo básico?
5.
¿Qué ocurriría si, para el algoritmo de búsqueda binaria, se realizasen k particiones
del array en lugar de 2?
6. Se han obtenido los siguientes resultados, para valores de n reducidos, en las
ejecuciones de dos algoritmos de ordenación. Se pide determinar el valor de n a
partir del cual es interesante utilizar selección directa como algoritmo básico en el
merge.
n
1
2
3
4
5
6
7
selección directa
20
32
50
74
104
140
182
1
merge
31
55
88
127
170
217
267
Metodología y Tecnología de la Programación
Hoja de Ejercicios 2
Bloque 2: Divide y Vencerás
7.
Demostrar que las funciones de complejidad de la multiplicación de enteros largos
y la multiplicación de matrices poseen un orden de nlog 3 y nlog 7, respectivamente.
¿Por orden, entendemos O o ?
8.
Diseñar un algoritmo de multiplicación de enteros largos tal que los operandos se
separen en 3 en lugar de en 2 partes. ¿Es más eficiente que el algoritmo original?
9.
Demostrar:
a) Que el algoritmo quicksort posee una complejidad O(n2) en el caso peor...
b) y una complejidad O(n log n) en el caso medio. Nota: La complejidad del
quicksort puede definirse como:
por lo que la complejidad media es:
Pista: Por inducción, se puede demostrar que:
10. Demostrar que el problema de selección posee una complejidad temporal O(n) en
el caso promedio.
11. Calcular la precisión en la determinación de la mediana del algoritmo
pseudomediana().
12. En algunas aplicaciones, se necesita conocer la ordenación de los elementos de un
vector, pero se desea mantener el vector sin modificar. En estos casos, resulta
conveniente un algoritmo de ordenación que devuelva un vector de índices tal que
la componente i-ésima indique la posición del elemento que debe ocupar el i-ésimo
lugar en el en el vector de entrada ordenado.
13. Sea T[1..n] un array ordenado formado por enteros diferentes, algunos de los cuales
pueden ser negativos. Dar un algoritmo que pueda hallar un índice i tal que 1in y
2
Metodología y Tecnología de la Programación
Hoja de Ejercicios 2
Bloque 2: Divide y Vencerás
T[i]=i, siempre que este índice exista. El algoritmo debe estar en un tiempo de
ejecución O(log n) en el peor caso.
14. Dado un array T[1..n] y un entero k tal que 1<=k<=n. Diseñar un algoritmo que
permita trasponer los primeros k y los últimos n-k elementos de T sin hacer uso de
un array auxiliar. Analizar la función de complejidad de dicho algoritmo. Por
ejemplo, si T es el siguiente vector:
a b C d e f g h i j
y k=3, el resultado deseado es:
d e f g h i j a b c
15. Dado un vector T[1..n] de elementos que se pueden ordenar , se desea hallar los m
elementos más pequeños, donde m es mucho más pequeño que n. ¿Qué es mejor,
a) Ordenar el vector T[1..n] y después acceder a los elementos T[1..m] o
b) Seleccionar el primer elemento, luego el segundo, y así sucesivamente hasta el
m-ésimo elemento o
c) Utilizar algún otro método?
16. Dado un array de enteros T[1..n], se dice que un entero es un elemento mayoritario
de T si aparece más de n/2 veces en T. Se pide:
a) Dar un algoritmo de orden lineal para calcular el elemento mayoritario,
suponiendo que el array T[1..n] puede ordenarse.
b) Dar un algoritmo de O(n log n) suponiendo que el array T[1..n] no pudiera
ordenarse.
17. Considera la aplicación de la técnica divide y vencerás sobre el siguiente problema.
Dado un array de T[1..n] de números enteros, buscamos la cadena de m celdas
consecutivas en este array cuya suma sea máxima (obviamente m<n). ¿Es
conveniente aplicar divide y vencerás en este caso y por qué? ¿Cómo sería una
resolución directa del problema?
18. Dado un vector T[1..n] de números enteros distintos y un número entero s se pide:
a) Diseñar un algoritmo de complejidad (n log n) que determine si existen o no
dos elementos de T tales que su suma sea exactamente s.
b) Suponiendo que el array T está ordenado, diseñar un algoritmo que solucione el
mismo problema en (n).
19. Sea T[1..n] un array de enteros ordenados. Este array T se somete a un
desplazamiento de k posiciones a la derecha (1  k < n). Por ejemplo, dado el array
T = (1, 2, 3, 4, 5), si realizamos un desplazamiento de k = 2 posiciones,
obtendriamos el array (4, 5, 1, 2, 3), mientras que con k = 4 posiciones, el array
3
Metodología y Tecnología de la Programación
Hoja de Ejercicios 2
Bloque 2: Divide y Vencerás
resultante es (2, 3, 4, 5, 1). Suponiendo que Ud. desconoce el valor de k, se pide
confeccionar un algoritmo en O(log n) que encuentre el mayor número entero en T.
4
Descargar