Ejerc2 2
Ejerc2 2
Ejerc2 2
6.2.Comprobar que los resultados anteriores son aplicables para cualquier valor de g(n)
y para valores de f(n) de la forma f(n) = apnp + ap-1np-1 + ... + a1n + a0.
6.7.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).
1
Algoritmos y Estructuras de Datos – Curso 06/07
Parte 2. Algorítmica. Tema 2. Divide y vencerás
Ejercicios
6.9.La figura de abajo representa el “helecho”, una curva fractal que puede ser generada
mediante una variedad de procedimientos. En su versión más simple, es posible
utilizar un procedimiento de divide y vencerás para dibujarlo. Suponer que la
cabecera del procedimiento es de la forma Pinta_Helecho(x, y: integer; ang, alt:
real); que pinta un helecho de altura alt, cuyo tallo principal tiene la base en (x, y) y
tiene ángulo ang respecto a la horizontal. Escribir un procedimiento para dibujar el
helecho, a partir de los parámetros anteriores, utilizando la técnica divide y
vencerás.
alt
ang
(x, y)
6.10. En un algoritmo divide y vencerás, en lugar de aplicar el caso base cuando n es
menor que cierto valor, se aplica la recurrencia siempre un número r de veces.
Calcular cuál será el tiempo de ejecución, suponiendo que un problema de tamaño n
es dividido en a problemas de tamaño n/b, siendo el tiempo del caso base g(n) = nq,
y el tiempo de la mezcla f(n) = np.
6.11. (EX) 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 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. ¿En qué tipo de algoritmos lo
clasificarías?
6.13. (EX) Considerando la ordenación por mezcla recursiva con datos en un array a,
donde en la llamadas a la mezcla se utiliza un array auxiliar b al que se asigna
memoria en cada llamada y que se libera al salir de la mezcla:
2
Algoritmos y Estructuras de Datos – Curso 06/07
Parte 2. Algorítmica. Tema 2. Divide y vencerás
Ejercicios
6.15. (EX) Calcular el orden exacto Θ del número promedio de comparaciones que se
hacen en la ordenación por mezcla dentro de la función de mezcla.
6.16. (TG 9.4) Construir un algoritmo para calcular el producto de dos matrices
cuadradas triangulares superiores, siendo el número de filas y columnas potencia de
2. Se supondrá que disponemos de un procedimiento Multip1(A, B, C), para
multiplicar matrices (triangulares o no) en un tiempo O(n3). Obtener el tiempo de
ejecución del algoritmo creado.
Recordatorio: una matriz se dice que es triangular superior si todos los elementos
que están por debajo de la diagonal principal valen 0. Se dice que es triangular
inferior si todos los elementos encima de la diagonal principal valen 0. Ejemplo de
matriz triangular superior:
1 3 5
0 2 4
0 0 2
6.17. (EX) Comentar cómo se implementaría con un método divide y vencerás similar
al de Strassen la multiplicación de una matriz cuadrada triangular por una cuadrada
no triangular. Habrá que indicar qué funciones sería necesario implementar y qué
habría que hacer para ahorrar memoria en las llamadas recursivas. Estudiar también
el tiempo de ejecución.
6.18. (TG 9.7) Se trata de resolver el problema de encontrar el cuadrado de unos más
grande en una tabla cuadrada de bits (un array n x n).
a) Programar un método directo para resolver el problema y dar una cota
superior (no demasiado mala) de su tiempo de ejecución.
b) Programar un método para resolver el problema por divide y vencerás y dar
una cota superior (no demasiado mala) de su tiempo de ejecución.
3
Algoritmos y Estructuras de Datos – Curso 06/07
Parte 2. Algorítmica. Tema 2. Divide y vencerás
Ejercicios
6.21. (EX J04) Suponer que trabajamos con enteros largos de tamaño n. Como vimos
en clase, el algoritmo clásico de multiplicación es un O(n2) y el método de
Karatsuba y Ofman consigue una reducción del orden al aplicar divide y vencerás
con 3 subproblemas de tamaño n/2, y tiempo de dividir y combinar en O(n).
Queremos diseñar otro algoritmo de divide y vencerás con un orden mejor que el
de Karatsuba y Ofman, para lo cual se debería desarrollar otra descomposición
recursiva. ¿Cómo tendría que ser la descomposición para conseguir la mejora?
Indicar justificadamente por lo menos dos tipos de descomposiciones (es decir, el
tamaño de los subproblemas y el número de estos) y el orden de complejidad que se
obtendría con las mismas. Considerar que la división del problema y combinación
son siempre O(n), y que no puede existir ninguna descomposición en a o menos
subproblemas si el tamaño de estos es de n/a.
4
Algoritmos y Estructuras de Datos – Curso 06/07
Parte 2. Algorítmica. Tema 2. Divide y vencerás
Ejercicios
6.24. (EX) Un problema se puede resolver usando divide y vencerás de dos formas
distintas. En la primera forma se divide el problema de tamaño n en dos
subproblemas de tamaño n/2, y la combinación tiene un coste n. Por la segunda
forma se divide el problema en tres subproblemas de tamaño n/3, y la combinación
tiene un coste 2n. En ambos métodos el tamaño del caso base es 1, y el coste de
resolver el caso base y de comprobar si el problema es suficientemente pequeño y de
dividir el problema también tiene coste 1.
a) Calcular el tiempo de ejecución de los dos algoritmos, y determinar cuál de los
dos es preferible en cuanto al tiempo de ejecución. ¿Y en cuanto al orden de
complejidad?
b) Estudiar la ocupación de memoria de los dos algoritmos, e indicar cuál es
preferible en cuanto a ocupación de memoria.
6.25. (EX M03) La curva de Koch es una curva fractal que se construye de la
siguiente forma. La curva de Koch de grado 0 es un segmento recto de longitud m.
La curva de Koch de grado 1 se forma sustituyendo ese segmento por 4 segmentos
contiguos, de longitud m/3, donde los dos centrales forman un ángulo de 60º (como
se muestra en la figura de abajo). En general, la curva de Koch de grado k se forma
sustituyendo cada segmento recto de la curva de Koch de grado k-1 por 4 segmentos
de 1/3 de longitud del original, donde los dos centrales forman un ángulo de 60º.