Algoritmos y Estructuras de Datos utn frcDescripción completa
Descripción: Algoritmos y Estructuras de Datos Tarea 4
Algoritmos y Estructuras de Datos Tarea 7Descripción completa
Descripción completa
Descripción completa
Descripción completa
Estructuras de datos, una perspectiva en CDescripción completa
Estructuras de datos, una perspectiva en C
Estructuras de datos, una perspectiva en CDescripción completa
Descripción: Estructuras de datos
LIbro de Estructura de Datos
gecaDescripción completa
Descripción completa
Descripción: Actividad 6 Algoritmos y Estructura de Datos
Estructura de datos y algoritmos de Aho y Hopcroft, un buen libro acerca de estructuras de datos como listas, pilas, colas, arboles y grafos. Analisis de complejidad de algoritmos, algoritmo…Descrição completa
Apuntes de Algoritmos y Estructuras de Datos Programaci´ on o n III Facultad de Inform´atica atica - UNLP Alejandro Santos [email protected]
Curso 2013 (actualizado 29 de julio de 2013)
Prog. III
2
´ Indice general 1. Tiempo Tiempo de Ejecuci Ejecuci´ ´ on on
7
1.1. 1.1. Tiempo Tiempo de de Ejecuci Ejecuci´ on o´n . . . . . . . . . . . . . . . . . 1.2. 1.2. An An´alisis ´alisis Asint´otico otico BigOh . . . . . . . . . . . . . . 1.2.1. 1.2.1. Po Porr definici definici´ on o´n . . . . . . . . . . . . . . . . . 1.2.2. 1.2.2. Ejemplo Ejemplo 1, por por definic definici´ i´ on on Big-Oh . . . . . . 1.2.3. 1.2.3. Po Porr regla regla de los polinomi polinomios os . . . . . . . . . . 1.2. 1.2.4. 4. Po Porr regla regla de la la suma suma . . . . . . . . . . . . . 1.2.5. 1.2.5. Otras Otras reglas reglas . . . . . . . . . . . . . . . . . . 1.2.6. 1.2.6. Ejemplo Ejemplo 2, por por definic definici´ i´ on on Big-Oh . . . . . . 1.2.7. 1.2.7. Ejemplo Ejemplo 3, por por definic definici´ i´ on on Big-Oh en partes . 1.2.8. 1.2.8. Ejemplo Ejemplo 4, por por definic definici´ i´ on. on. . . . . . . . . . . 1.3. 1.3. An An´´alisis alisis de Algoritmos y Recurrencias . . . . . . . . 1.3.1. 1.3.1. Expresi Expresi´on o´n constante . . . . . . . . . . . . . 1.3.2. 1.3.2. Grupo de const constan antes tes . . . . . . . . . . . . . 1.3.3. 1.3.3. Secuenci Secuencias as . . . . . . . . . . . . . . . . . . . 1.3.4. 1.3.4. Cond Condici icional onales es . . . . . . . . . . . . . . . . . 1.3. 1.3.5. 5. for y whi while le . . . . . . . . . . . . . . . . . . . 1.3.6. 1.3.6. for y while, while, ejemplo ejemplo . . . . . . . . . . . . . . 1.3.7. Llamadas recursivas recursivas . . . . . . . . . . . . . 1.3.8. 1.3.8. Ejemplo Ejemplo 5, itera iterativ tivoo . . . . . . . . . . . . . . 1.3.9. 1.3.9. Ejemplo Ejemplo 6, recur recursiv sivoo . . . . . . . . . . . . . 1.3.10. Ejemplo 7, recursivo . . . . . . . . . . . . . 1.3.11. Ejemplo 8, Ejercicio 12.4 . . . . . . . . . . . 1.4. 1.4. Otros Otros ejemplo ejemploss . . . . . . . . . . . . . . . . . . . . 1.4. 1.4.1. 1. Ejemp Ejemplo lo 9 . . . . . . . . . . . . . . . . . . . Planteo de la recurrencia recurrencia . . . . . . . . . . . Demostraci´on on del orden (f ( f (n)) . . . . . . 1.4. 1.4.2. 2. Ejemp Ejemplo lo 10 . . . . . . . . . . . . . . . . . . Antes de empezar empezar . . . . . . . . . . . . . . . Ejercicio . . . . . . . . . . . . . . . . . . . .
Introducci´ on on El presente apunte es una recopilaci´ on on de explicaciones y ex´amenes amenes parciales dados como parte de los cursos 2012-2013 de Programaci´ on o n III de 1 Ingenier Inge nier´´ıa en Computaci´ Compu taci´on, on, UNLP . Actualmente se encuentra en estado de borrador, y puede contener rro re s u omisiones, por lo que se recomienda consultar a los docentes ante cualquier duda o ambiguedad. Puede contactarse con el autor por e-mail a: [email protected] .
1
http://www.info.unlp.edu.ar/
7
´ INDICE GENERAL
Prog. Prog. III
8
Cap´ıtulo 1 Tiem Tiemp po de Ejec Ejecuc uci´ i´ on on
9
´ 1.1. TIEMPO TIEMPO DE DE EJECUC EJECUCI I ON
1.1. 1.1.
Prog. Prog. III
Tiem Tiempo po de Ejec Ejecuc uci´ i´ on on
Nos interesa analizar y comparar diferentes algoritmos para saber cu´ al es m´as as eficiente. Una forma de hacerlo hacer lo es escribir el c´odigo odigo de cada algoritmo, algor itmo, ejecutarlos ejecuta rlos con diferentes entradas y medir el tiempo de reloj que demora cada uno. Por ejemplo, para ordenar una secuencia de n´ umeros existen diferentes algoritmos: inserci´on, on, mergesort, etc. Se puede tomar cada uno de estos algoritmos y ejecutarlos con una secuencia de n´ umeros, midiendo el tiempo que umeros, tarda cada uno. Sin embargo, existe otra forma de comparar algoritmos, que se conoce como an´ alisis alisis asint´otico. otico. Consiste en analizar el c´odigo odigo y convertirlo en una expresi´on on matem´atica atica que nos diga el tiempo que demora cada uno en funci´ on de la cantidad de elementos que se est´ a procesando. De esta forma, ya no es necesario ejecutarlos, y nos permite comparar algoritmos en forma independiente de una plataforma en particular. En el caso de los algoritmos de ordenaci´ on, on, la funci´on on nos dar´ a un valor en base a la cantidad de elementos que se est´ an an ordenando.
1.2.
An´ alisis alisis Asint´ otico otico BigOh
f ( f (n) es de
O(g(n)) si y solo si ∃c tal que f ( f (n) ≤ cg( cg (n), ∀n ≥ n . 0
La definici´on on de BigOh dice que una funci´ on f on f ((n) es de orden g orden g((n) si existe una constante c constante c tal tal que la funci´on g on g((n) multiplicada por dicha constante acota por arriba a la funci´on on f ( f (n). Cuando decimos acota queremos decir que todos los valores para los que la funci´ on on est´a definida son mayores. Esto es, la funci´ on on g (n) acota a f ( f (n) si cada valor de g (n) es mayor o igual que f ( f (n). Por ejemplo, la funci´on on g (n) = n + 1 acota por arriba a la funci´ on on f ( f (n) = n ya que para todo n 0, f ( f (n) g (n).
≥
≤
Nuestro objetivo es encontrar un c un c que que multiplicado por g por g((n) haga que se cumpla la definici´on. on. Si ese c ese c existe, existe, f f ((n) ser´a de orden g orden g((n). Caso contrario, si no es posible encontrar c, f ( f (n) no es de orden g (n). El problema entonces se reduce a encontrar el c, que algunas veces es trivial y directo, y otras no lo es. Adem´as, as, el hecho de no poder encontrarlo no quiere decir que no exista. 10
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
1.2. 1.2.1. 1.
Prog. Prog. III
Por defin definic ici´ i´ on on
Usando la definici´on o n de BigOh, una forma de descubrir si una funci´ on on f ( f (n) es de orden g (n) se traduce en realizar operaciones para despejar el valor de c, y descubrirlo en caso que exista, o llegar a un absurdo en caso que no exista.
1.2.2 1.2.2..
Ejemp Ejemplo lo 1, por defin definic ici´ i´ on on Big-Oh
Ejemplo: ¿3n es de
n
O(2 )? Primero escribimos la definici´on on de BigOh: f (n) ≤ cg( cg (n), ∀n ≥ n ∃c, f (
0
(1.2.1)
Luego identificamos y reemplazamos las partes: f ( f (n) = 3n g(n) = 2n
(1.2.2) (1.2.3)
Una vez identificadas las partes podemos expresar la pregunta en forma de BigOh, donde tenemos que encontrar un c que cumpla lo siguiente: 3n
n
≤ c2 , ∀n ≥ n
0
(1.2.4)
La segunda parte de la definici´ on, on, que dice para todo n mayor o igual a n0 , es tan importante como la primera, y no hay que olvidarse de escribirlo. El valor de n0 puede ser cualquier que nos ayude a hacer verdadera la desigualdad. Por ejemplo, en este caso se puede tomar n0 = 1. n0 no puede ser negativo. Elegir un n0 negativo significa que estamos calculando el tiempo de ejecuci´ on con una cantidad negativa de elementos, on algo que no tiene sentido. Eso tambi´ tambi´en en significa significa que las funciones siempre deben dar un valor positivo, dado que el valor de la funci´ on de la que se quiere calcular el orden on representa tiempo de ejecuci´ o n de un algoritmo. El tiempo debe ser siemon pre positivo, y por ejemplo decir que una funci´ on on demora 3 segundos en procesar 10 elementos tampoco tiene sentido. Se asume que 3n es de (2n), y se pasa el 2n dividiendo a la izquierda:
−
O
3n 2n
3 2
≤ c, ∀n ≥ n ≤ c, ∀n ≥ n
0
(1.2.5)
0
(1.2.6)
n
11
´ ´ 1.2. 1.2. AN ALISIS ASINT OTICO BIGOH
Prog. Prog. III
Se llega a un absurdo, ya que no es posible encontrar un n´ umero umero c para que se cumpla la desigualdad para todo n mayor que alg´ un n0 fijo. Por lo un tanto es falso, 3n no es de (2n). Un an´alisis a lisis un poco m´as a s cercano nos muestra que la funcion ( 32 )n es siempre creciente hasta el infinito, donde el l´ımite:
O
l´ım
n→∞
3 2
n
(1.2.7)
toma el valor infinito. Por ejemplo: para cualquier constante c fija, para algunos valores de n se cumple, pero para otros no. Con c = 100, n
≤ 3 2
100, 100, n
∀ ≥n
0
(1.2.8)
Despejando el valor de n, log log
3 2
n
≤ 3 2
3 2
3 2
log 100, 100, n
∀ ≥n
3 2
0
(1.2.9)
n
= n;log n;log 100
≈ 11, 11,35 n ≤ 11, 11,35, 35, ∀n ≥ n
(1.2.10)
3 2
0
(1.2.11)
No es posible que n que n sea menor a 11, 11,35 y a la vez n vez n sea sea mayor a alg´ un n 0 , un n ya que n debe ser mayor que n0 siempre.
1.2.3 1.2.3..
Por reg regla la de los los poli polino nomi mios os
En las teor´ teor´ıas se vieron algunas reglas para simplificar simplificar el trabajo: Dado un polinomio P polinomio P ((n) de grado k grado k,, sabemos que el orden del polinomio k 2 es (n ). Ejemplo: P Ejemplo: P ((n) = 2n + 3n 3n + 5. Como el grado del polinomio es 2, 2 el orden de P ( P (n) es (n ). Esta regla solo se aplica a polinomios. Cualquier funci´on o n que no lo sea habr´ a que desarrollarla por alg´ un otro m´etodo. un eto do. Ejemplo: Ejemp lo: T ( T (n) = n = n no es un polinomio, y no puede aplicarse esta regla.
O
O
1 2
1.2. 1.2.4. 4.
√
Por regl regla a de de la la sum suma a
Si T 1 (n) =
O(f ( f (n)) y T (n) = O(g (n)) entonces: 2
T 1 (n) + T + T 2 (n) = max( max ( (f ( f (n)), )), (g (n)))
O
12
O
(1.2.12)
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
1.2. 1.2.5. 5.
Prog. Prog. III
Otra Otrass regl reglas as
T ( T (n) = logk n es (n). T ( T (n) = cte, cte, donde cte es una expresi´ on constante que no depende del on valor de n es (1). T ( T (n) = cte f ( f (n) es (f ( f (n)).
→ O → O × → O
1.2.6 1.2.6..
Ejemp Ejemplo lo 2, por defin definic ici´ i´ on on Big-Oh
Calcular y demostrar el orden de T ( on: T (n) por definici´on: T ( T (n) = 2n3 + 3n 3n3 log(n log(n) Teniendo el T ( T (n), para demostrar por definici´ on o n el BigOh se empieza planteando cu´ a l puede ser, ya sea de forma intuitiva o por alguna de las al reglas conocidas. En este e ste caso, ca so, el orden parecer´ parecer´ıa ser: ser : (n3 log(n log(n)). Una vez planteado el Big-Oh posible, se aplica la definici´on on para verificar si realmente el orden elegido corresponde con la funci´ on: on:
O
∃k ∈ R, T ( T (n) ≤ kF ( kF (n), ∀n ≥ n
0
(1.2.13)
Se reemplazan T ( T (n) y F ( F (n) por sus correspondientes valores. La funci´ on on 3 F ( F (n) es el orden elegido, F ( F (n) = n log(n log(n): 2n3 + 3n 3n3 log(n log(n)
≤ kn
3
log(n log(n), n
∀ ≥n
0
(1.2.14)
Se pasa dividiendo n3 log(n log(n) hacia la izquierda: 2n3 + 3n 3n3 log(n log(n) n3 log(n log(n) 2 + 3 k, n log(n log(n)
≤ k, ∀n ≥ n ≤ ∀ ≥ n ,n = 2 0
0
0
(1.2.15) (1.2.16)
Se puede ver que es posible encontrar un k fijo que, sin importar el valor tomado por n, la desigualdad sea siempre cierta. Esto ocurre porque mientras n es m´as as grande, 2/ 2/ log(n log(n) es cada vez m´as as chico. Por lo tanto, la funci´on on nunca va a tomar un valor mayor que alg´ un un k . En este ejemplo, k = 5 para que la desigualdad sea verdadera para todo n n0 , con n0 = 2. El valor de n de n 0 no puede ser menor que 2 ya que con n = 1 se tendr´a una divisi´on on por cero.
≥
13
´ ´ 1.2. 1.2. AN ALISIS ASINT OTICO BIGOH
Prog. Prog. III
El objetivo de la demostraci´on on es encontrar un k fijo de forma que se cumpla la desigualdad, para todo n n0 , y lo encontramos. Por lo tanto, T ( T (n) es de orden (n3 log(n log(n)).
≥
O
1.2.7 1.2.7..
Ejemp Ejemplo lo 3, por defin definic ici´ i´ on Big-Oh en partes on
Calcular y demostrar el orden de T ( T (n) por definici´on: on: 2n2 + n log(n log(n) T ( T (n) = 5n3 + 2n
(1.2.17)
Una segunda manera de demostrar el orden a partir de un T ( T (n) es en partes. Se toma cada t´ermino ermino por separado, y se demuestra demuestra el orden de cada uno. Si en todas las partes se cumple la desigualdad, quiere decir que se cumple en la funci´on on original. De la misma forma que siempre, hay que elegir un orden para luego verificar si realmente se cumple. En este caso se elige: 3
O(n ) Es importante imp ortante que todos los t´erminos erminos se comparen con el mismo orden , de otra forma la demostraci´ on on no ser´a correcta. Planteando los tres t´erminos erminos por separado se tiene: T 1 (n) = 5n3 T 2 (n) = 2n2 T 3 (n) = n log(n log(n)
(1.2.18) (1.2.19) (1.2.20)
Demostrando cada uno por separado: F (n), ∀n ≥ n ∃k , T (n) ≤ k F ( F (n), ∀n ≥ n ∃k , T (n) ≤ k F ( F (n), ∀n ≥ n ∃k , T (n) ≤ k F ( 1
1
1
1,0
2
2
2
2,0
3
3
3
3,0
(1.2.21) (1.2.22) (1.2.23)
Reemplazando las tres desigualdades se tiene: 3
3
∃k , 5n ≤ k n , ∀n ≥ n 5n ≤ k − −→ →5≤k n 1
1
1
(1.2.24)
1
(1.2.25)
3
3
1
14
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
2
3
Prog. Prog. III
∃k , 2n ≤ k n , ∀n ≥ n 2n 2 k − ≤ −→ → ≤ k n n 2
2
2
(1.2.26)
2
(1.2.27)
2
2
3
3
∃k , n log(n log(n) ≤ k n , ∀n ≥ n n log(n log(n) log(n log(n) ≤ −→ → ≤k k − n n 3
3
3
3
2
3
(1.2.28)
3
(1.2.29)
En los tres casos se llega a que la desigualdad se cumple, siendo posible encontrar un ki R fijo para cualquier valor positivo de n, mayor que algun ni . Por lo tanto, T ( T (n) es de orden (n3 ).
∈
1.2.8 1.2.8..
O
Ejemp Ejemplo lo 4, por defin definic ici´ i´ on. on.
¿Cu´al al es el orden
O() de la siguiente funci´on? on? F ( F (n) = n 1/2 + n1/2 log4 (n)
a) ¿Es de orden (n1/2 )? Para que F que F ((n) sea (n1/2) hace falta encontrar un k constante tal que se cumpla la siguiente desigualdad para todo n alg´ un n0 . un
O
O
≥
n1/2 + n1/2 log4 (n)
≤ kn
1/2
(1.2.30)
Pasando dividiendo el n1/2 hacia la izquierda queda:
n1/2 n1/2 log4 (n) + n1/2 n1/2 1 + log4 (n)
≤k ≤k
(1.2.31)
(1.2.32)
Se concluye que es falso, porque a medida que n aumenta, la parte de la izquierd izquierdaa de la desigua desigualdad ldad 1 + log4 (n) tambi´en en aumenta, aumenta , para p ara todo to do n cualquier n0 , y no es posible encontrar un k constante. No es de orden (n1/2 ).
≥
O
15
´ ´ 1.2. 1.2. AN ALISIS ASINT OTICO BIGOH
Prog. Prog. III
b) ¿Es de orden (log4 (n))? Para que F ( F (n) sea (log4 (n)) hace falta encontrar un k constante tal que se cumpla la siguiente desigualdad para todo n alg´ un n0 . un
O
O
≥
n1/2 + n1/2 log4(n)
≤ k log (n)
(1.2.33)
4
Pasando dividiendo el log4(n) hacia la izquierda queda: n1/2 n 1/2 log4 (n) + log4 (n) log4 (n) n1/2 + n1/2 log4 (n)
≤k
(1.2.34)
≤k
(1.2.35)
Se concluye que es falso, porque a medida que n aumenta, la parte de / la izquierda de la desigualdad logn (n) + n1/2 tambi´en en aumenta, aument a, para todo to do n cualquier n0 , y no es posible encontrar un k constante. No es de orden (log4 (n)). 1 2 4
≥
O
c) ¿Es de orden (n1/2 log4(n))? Para que F ( F (n) sea (n1/2 log4 (n)) hace falta encontrar un k constante tal que se cumpla la siguiente desigualdad para todo n alg´ un n0. un
O
O
≥
n1/2 + n1/2 log4 (n)
≤ kn
1/2
log4 (n)
(1.2.36)
Pasando dividiendo el n1/2 log4(n) hacia la izquierda queda: n1/2 n 1/2 log4 (n) + n1/2 log4 (n) n1/2 log4 (n) 1 + 1 log4 (n)
≤ k ≤k
(1.2.37)
(1.2.38)
Se concluye que es verdadero, porque a medida que n aumenta, la parte de la izquierda de la desigualdad log1(n) + 1 va tomando tomando cada vez vez valores m´as as peque˜ nos nos para todo n 2, n0 = 2. Por lo tanto, es posible encontrar el k constante y fijo que haga que se cumpla la desigualdad y F ( F (n) es de orden (n1/2 log4 (n)).
≥
O
16
4
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
1.3.
Prog. Prog. III
An´ alisis alisis de Algoritmo Algoritmoss y Recurrenc Recurrencias ias
El an´alisis a lisis de algoritmos consiste en convertir un bloque de c´odigo o digo o funci´on on escrita en alg´ un lenguaje de programaci´ un on a su equivalente versi´ on on on que nos permita calcular su funci´on on de tiempo de ejecuci´ on on T ( T (n). Eso es, el objetivo es encontrar cual es el tiempo de ejecuci´ on on a partir de la cantidad de elementos. El objetivo de resolver una recurrencia es convertir la funci´ on on en su forma expl´ expl´ıcita equivalente equivalente sin contener sumatorias ni llamadas recursivas. Para ello hace falta aplicar las definiciones previas de sumatorias, y el mecanismo de resoluci´on on de recurrencias.
1.3. 1.3.1. 1.
Expr Expres esi´ i´ on on constante
Cualquier Cualquier expresi´ expresion o´n que no dependa de la cantidad de elementos a procesar se marcar´ a como constante, c1 ,...,ck .
1.3.2 1.3.2..
Grupo Grupo de cons consta tan ntes tes
Cualquier grupo de constantes c1 ,...,ck se pueden agrupar en una unica u´nica constante c, c = (c1 + ... + ... + + c ck ).
1.3.3 1.3.3..
Secu Secuen enci cias as
Dadas dos o m´as as sentencias una d despu´ espu´es es de la otra otr a sus tiempos se suman. suman .
1.3.4 1.3.4..
Cond Condic icio iona nale less
Dado un condicional if , el tiempo es el peor caso entre todos los caminos posibles de ejecuci´ on. on.
1.3. 1.3.5. 5.
for for y while hile
Los bloques for y while while se marcan como la cantidad de veces que se ejecutan, expresado como una sumatoria desde 1 a esa cantidad. En el caso del for del for se se usar´a como variable de la sumatoria el mismo indice del for. En el caso del while del while se se usar´a una variable que no haya sido usada.
1.3. 1.3.6. 6.
for for y whi while le,, eje ejemp mplo lo
Se tiene el siguiente c´ odigo: odigo: 17
´ 1.3. 1.3. AN ALISIS DE ALGORITMOS Y RECURRENCIAS
1 v oi o i d i n t f ( i n t N) 2 int x = 1 ; 3 while ( x < N) 4 / A l g o d e O ( 1 ) . . . 5 x = x 2; 6 7 return x ; 8
Prog. Prog. III
{
{
/
}
}
Tal como se describi´o, o, hace falta escribir el tiempo T tiempo T ((n) como una sumatoria de 1 hasta la cantidad de veces que se ejecuta el while el while . La cantidad de veces vece s que ´este est e while se se ejecuta se puede plantear de la siguiente forma: 1. El while El while se se ejecuta mientras se cumple la condici´on on x < N . N . 2. La variable variable x x comienza en 1, en cada paso se multiplica su valor por 2, y la ejecuci´on on termina cuando x llega a N a N .. 3. La cantidad cantidad de veces que que se ejecuta el while el while corresponde corresponde con la cantidad de veces que la variable x se multiplica por 2. Si decimos que la variable k representa la cantidad de veces que se multiplica la variable x por dos, la variable x entonces vale: x = 1
k
× 2 × 2 × ... × 2 = 2
(1.3.1)
Adem´as as pedimos que x que x sea igual a N a N para para que el while finalice: x = N = N
(1.3.2)
Nos interesa entonces hallar el valor de k, a fin de hallar la cantida de veces que se ejecuta el while el while . Eso se logra facilmente aplicando propiedades de logaritmos: x = 2k x = N = N 2k = N log2(2k ) = log2 N k = log2 N 18
(1.3.3) (1.3.4) (1.3.5) (1.3.6) (1.3.7)
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
Prog. Prog. III
Por lo tanto, el T ( T (n) del ejemplo anterior es: log2 N
T ( T (n) = c1 +
(c2)
(1.3.8)
x=1
1.3.7. 1.3.7.
Llamad Llamadas as recurs recursiv ivas as
Las llamadas recursivas se reemplazan por la definicion de tiempo recursiva. Las definiciones recursivas son funciones definidas por partes, teniendo por un lado el caso base y por el otro el caso recursivo.
1.3.8 1.3.8..
Ejemp Ejemplo lo 5, iter iterat ativ ivo o
1 v oi o i d i n t sumar( i n t [ ] d a t o s ) 2 i n t acumulado = 0; 3 =0; i
{
{
}
}
Linea 2: c1 . Linea 3:
n i=1 .
Linea 4: c2 . Linea 6: c3 .
Todo junto, el T ( T (n) de la funci´on on sumar es: n
T ( T (n) = c 1 + (
+ c3 c2 ) + c
(1.3.9)
i=1
El siguiente paso es convertir el T el T ((n) a su versi´on on expl´ expl´ıcita sin sumatorias sumat orias.. Aplicando las identidades de la secci´on on anterior: T ( T (n) = c 1 + nc + nc2 + c + c3 = c 4 + nc + nc2 , c4 = c 1 + c + c3
(1.3.10)
Por lo tanto, el T ( T (n) de la funci´on on sumar es: T ( T (n) = c 4 + nc + nc2
¿Cu´al al es su orden de ejecuci´ on on BigOh? T ( T (n) es
O(n).
19
(1.3.11)
´ 1.3. 1.3. AN ALISIS DE ALGORITMOS Y RECURRENCIAS
1.3.9 1.3.9..
Prog. Prog. III
Ejemp Ejemplo lo 6, recu recurs rsiv ivo o
1 i n t rec 1 ( i n t n ) 2 i f ( n <= 1 ) 3 return 3 ; 4 else 5 return 1 + r e c 1 ( n 1) 6
{
rec1 (n 1);
−
}
−
Las funciones recursivas se definen por partes, donde cada parte se resuelve de forma similar a un codigo iterativo: T ( T (n) =
c1 2T ( T (n
− 1) + c + c
n 1 n > 1
≤
2
El objetivo es encontrar una versi´on on expl´ expl´ıcita de la recurrencias. Se comienza por escribir las primeras definiciones parciales:
T ( T (n T ( T (n
− −
T ( T (n) = 2T ( T (n 1) + c + c2 , n > 1 1) = 2T 2T ((n 2) + c + c2 , n 1 > 1 2) = 2T 2T ((n 3) + c + c2 , n 2 > 1
− −
−
(1.3.12) (1.3.13) (1.3.14)
− −
Segundo, Segun do, se expande expan de cada ca da t´ermino ermin o tres tre s o´ cuatro veces, las que sean necesarias para par a descubrir la forma en la que los diferentes t´erminos erminos van cambiando: T ( T (n) = 2T ( T (n 1) + c + c2 T ( T (n) = 2(2T 2(2T ((n 2) + c + c2 ) + c + c2 T ( T (n) = 2(2(2T 2(2(2T ((n 3) + c + c2 ) + c + c2 ) + c + c2 T ( T (n) = 2(22 T ( T (n 3) + 2c 2c2 + c + c2 ) + c + c2 T ( T (n) = 23T ( T (n 3) + 22 c2 + 2c 2 c2 + c + c2 , n 3 1
− −
−
−
−
∀ − ≥
(1.3.15) (1.3.16) (1.3.17) (1.3.18) (1.3.19)
La definici´ on on recursiva contin´ ua ua mientras el n > 1, por lo que en k en k pasos tenemos la expresi´ on on general del paso k paso k:: k−1 k
T ( T (n) = 2 T ( T (n
− k) +
La llamada recursiva finaliza cuando n cuando n 20
2i c2
i=0
− k = 1, por lo tanto:
(1.3.20)
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
Prog. Prog. III
n k=1 k = n = n 1
−
n−1−1
T ( T (n) = 2
n−1
T (1) T (1) +
(1.3.21) (1.3.22)
−
2i c2
(1.3.23)
2i c2
(1.3.24)
i=0 n−2
T ( T (n) = 2n 1 c1 + −
i=0 n−2
T ( T (n) = 2n 1 c1 + c + c2 −
2i
(1.3.25)
− 1) −c −c
(1.3.26) (1.3.27) (1.3.28)
i=0 n−2+1
n−1
T ( T (n) = 2 c1 + c + c2 (2 T ( T (n) = 2n 1 c1 + 2 n 1 c2 T ( T (n) = 2n 1 (c1 + c + c2 ) −
−
−
2 2
¿Cu´al al es su orden de ejecuci´ on on BigOh? T ( T (n) es
n
O(2 ).
1.3.1 1.3.10. 0.
Ejemp Ejemplo lo 7, recu recurs rsiv ivo o
T ( T (n) =
c 2n + T + T ((n/2) n/2)
n = 1 n 2
≥
Se asume que n es potencia entera de 2. n
k=0
1 =2 2k
− 21
n
Definiciones parciales: 2n n n T ( T ( 2 ) = 2 + T 3 2 2 2
T ( T (n) = 2n + T + T ((n/2) n/2) n 2n n T ( T ( ) = + T 2 2 2 2
T ( T (
Desarrollo: 21
n 2n n ) = + T 23 23 24
´ 1.3. 1.3. AN ALISIS DE ALGORITMOS Y RECURRENCIAS
Prog. Prog. III
T ( T (n) = 2n + T + T ((n/2 n/2) 2n n T ( T (n) = 2n + + T 2 2 2 2n 2 n 2n n T ( T (n) = 2n + + + T 2 22 23 2n 2n 2 n 2n n T ( T (n) = 2n + + 2 + + T 2 2 23 24 3
T ( T (n) =
(1.3.29)
i=0 3
(1.3.30)
(1.3.31)
(1.3.32)
2n n + T 2i 24
(1.3.33)
1 n + T 2i 24
(1.3.34)
T ( T (n) = 2n
i=0
Paso general k:
k−1
T ( T (n) = 2n
i=0
1 n + T 2i 2k
(1.3.35)
Caso base: n =1 2k
k
= k → n = 2 → log n = k
log n−1
T ( T (n) = 2n
1 n + T 2i 2log n
−
(1.3.36)
1 + c 2i
(1.3.37)
+ c
(1.3.38)
+ c
(1.3.39)
i=0
log n−1
T ( T (n) = 2n
i=0
1
T ( T (n) = 2n 2
2log n 1 2n T ( T (n) = 4n 2log n −
−
1
−
(1.3.40) 22
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
Prog. Prog. III
+ c − (2 2n)/2 + c 2n T ( T (n) = 4n − + c + c (n)/2 4n T ( T (n) = 4n − + c n T ( T (n) = 4n − 4 + c + c
T ( T (n) = 4n
1.3.1 1.3.11. 1.
log n
(1.3.41)
(1.3.42)
(1.3.43)
(1.3.44)
Ejemp Ejemplo lo 8, 8, Ejer Ejerci cici cio o 12 12.4 .4 T ( T (n) =
1 n 8T ( + n3 T ( ) + n 2
n = 1 n 2
≥
Soluciones parciales: n T ( T (n) = 8T ( T ( ) + n + n3 2 n n n T ( T ( ) = 8T ( T ( ) + ( )3 2 4 2 n n n T ( T ( ) = 8T ( T ( ) + ( )3 4 8 4 n n n T ( T ( ) = 8T ( T ( ) + ( )3 8 16 8
(1.3.45) (1.3.46) (1.3.47) (1.3.48)
Desarrollo: n T ( T (n) = 8T ( T ( ) + n + n3 2 n n T ( T (n) = 8(8T 8(8T (( ) + ( )3 ) + n + n3 4 2 n n n T ( T (n) = 8(8(8T 8(8(8T (( ) + ( )3 ) + ( )3) + n + n3 8 4 2 n n n n T ( T (n) = 8(8(8(8T 8(8(8(8T (( ) + ( )3) + ( )3 ) + ( )3 ) + n + n3 16 8 4 2 n n n n T ( T (n) = 8(8(82 T ( T ( ) + 8( )3 + ( )3) + ( )3 ) + n + n3 16 8 4 2 n n n n T ( T (n) = 8(83 T ( T ( ) + 8 2 ( )3 + 8( )3 + ( )3 ) + n + n3 16 8 4 2 n n n n T ( T (n) = 84 T ( T ( ) + 8 3 ( )3 + 82 ( )3 + 8( )3 + n3 16 8 4 2 n n3 = 80 ( 0 )3 2 23
´ 1.3. 1.3. AN ALISIS DE ALGORITMOS Y RECURRENCIAS
T ( T (n) = 84T ( T (
Prog. Prog. III
n 3 n 3 2 n 3 1 n 3 0 n 3 ) + 8 ( ) + 8 ( ) + 8 ( ) + 8 ( 0) 24 23 22 21 2 3
n T ( T (n) = 8 T ( T ( 4 ) + 2
n T ( T (n) = 8 T ( T ( k ) + 2
4
Caso k: k
Caso base: n =1 2k
i=0
k−1
i=0
n 8i ( i )3 2
(1.3.58)
n 8i ( i )3 2
(1.3.59)
k
log 2 → n = 2 → log n = log
k
= k
k = log n log n
T ( T (n) = 8
T ( T (
log n
T ( T (n) = 8
2
(1.3.60)
n 8i ( i )3 2
(1.3.61)
n3 8 ( i 3) (2 )
(1.3.62)
(23 )i n3 ( 3i ) 2
(1.3.63)
log n−1
n
)+ log n
i=0
n T ( T ( ) + n
(1.3.57)
log n−1
i=0
i
log n−1 log n
T ( T (n) = 8
T (1) T (1) +
i=0
log n−1 log n
T ( T (n) = 8
T (1) T (1) +
i=0
23i n3 ( 3i ) 2
(1.3.64)
log n−1
log n
T ( T (n) = 8
T (1) T (1) +
(n3)
(1.3.65)
i=0
T ( T (n) = 8log n + n3 log n
(1.3.66)
T ( T (n) = (23 )log n + n3 log n
(1.3.67)
T ( T (n) = 23
(1.3.68)
log n
×
+ n3 log n
T ( T (n) = (2(log n) )3 + n3 log n T ( T (n) = n 3 + n3 log n
24
(1.3.69) (1.3.70)
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
1.4. 1.4.
Prog. Prog. III
Otro Otross ejem ejempl plos os
1.4. 1.4.1. 1.
Eje Ejemplo mplo 9
Sea el siguiente programa, a. Calcula Calcularr su T su T ((n), detallando los pasos seguidos para llegar al resultado. resultado.
O(f ( f (n)) justificando usando la definici´ on on de BigOh.
b. Calcula Calcularr su
1 i n t uno( i n t n ) 2 ++) f o r ( i n t i = 1 ; i <= n ; i ++ 3 1 ; j <= i ; j ++ ++) f o r ( i n t j = 1; 4 algo de O ( 1 ) ; 5 6 7 i f ( n > 1 ) 8 ++) f o r ( i n t i = 1 ; i <= 4 ; i ++ 9 uno ( n / 2 ) ; 10
{
}
{
{
}
}
Planteo de la recurrencia
c1
n T ( T (n) = n i c + 4T 4 T ( ( ) 2 i=1 j=1 j =1 2 Eliminando las sumatorias tenemos: n
i
n
c2 =
i=1 j=1 j =1
n
ic2 = c 2
i=1
i =
i=1
T ( T (n) =
c2 2 n (n ( n + n) 4 T (( ) n) + 4T 2 2 25
≥
c2 n(n + 1) c2 2 = (n ( n + n) n) 2 2
c1 c2 2 n (n ( n + n) n) + 4T 4 T (( ) 2 2 Desarrollo de la recurrencia: T ( T (n) =
c2 2 c2 n 2 n = (n (n + n) n) + 4 + + 2 2 2 2 c2 n 2 n n 42 + + 4T 4 T 2 22 22 23
(1.4.3)
(1.4.4)
(1.4.5)
c2 2 c2 n 2 n (n (n + n) n) + 4 + + 2 2 2 2 c2 n 2 n n 3 42 + + 4 T 2 22 22 23
(1.4.6)
c2 2 c2 n 2 n (n (n + n) n) + 4 + + 2 2 2 2 n 2 n 2 c2 4 + + 2 22 22 c2 n 2 n n 43 + + 4T 4 T 2 23 23 24
(1.4.7)
c2 2 c2 n 2 n (n (n + n) n) + 4 + + 2 2 2 2 c2 n 2 n 42 + + 2 22 22 n 2 n n 3 c2 4 4 + + 4 T 2 23 23 24
(1.4.8)
=
=
=
c2 = 2 c2 = 2 c2 = 2
3
w
4
w=0
3
w
4
w=0 3
2
2w
w=0
c2 = 2
n 2w
2
+
n 2w
+ 44 T
n 24
(1.4.9)
n2 (2w )2
+ 4w
n 2w
+ 44 T
n 24
(1.4.10)
n 2 22w
+ 22w
n 2w
+ 44 T
n 24
(1.4.11)
3
n2 + 2 w (n) + 44 T
w=0
26
n 24
(1.4.12)
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
c2 T ( T (n) = 2 Paso general k: c2 T ( T (n) = 2
3
c2 n + 2 w=0
2
k−1
c2 n + 2 w=0
2
Prog. Prog. III
3
w
4
2 n + 4 T
w=0
k−1
w
k
2 n + 4 T
w=0
n 24
n 2k
(1.4.13)
(1.4.14)
Paso base: n =1 2k n = 2k log2 n = n = log 2 (2k ) log2 n = n = k k
log2 (n)−1
log2 (n)−1
(1.4.15) (1.4.16) (1.4.17) (1.4.18)
c2 c 2 n 2w n + 4 log n T log n (1.4.19) T ( T (n) = n2 + 2 w=0 2 w=0 2 c2 c 2 n = n 2 log2 (n) + (log2(n) + 1)n 1)n + 4 log n T log n (1.4.20) 2 2 2 log n 2 log n log n 2 4 = (2 ) = (2 ) = n 2 (1.4.21) c2 c2 = n 2 log2 (n) + (log2 (n) + 1)n 1)n + n + n2 T ( T (1) (1.4.22) 2 2 c2 c2 c 2 T ( T (n) = n 2 log2 (n) + n log2 (n) + n + n + c c1 n2 (1.4.23) 2 2 2 2
2
2
2
2
Demostraci´ on on del orden
2
2
f (n)) O(f (
Se elige el t´ermino ermino de mayor orden: c2 n 2 log2 (n) f ( f (n) es de (g(n)) si y solo si w tal que f ( f (n) wg( wg (n), n ¿T ( T (n) es de (n2 log2 (n))? 2
O O
∃
≤
∀ ≥n . 0
c2 2 c 2 c2 n log2 (n) + n log2 (n) + n + n + c c1n2 wn2 log2 (n) (1.4.24) 2 2 2 2 c2 n log2 (n) c2n log2 (n) c2 n c1 n2 + 2 + + w (1.4.25) 2n2 log2 (n) 2n log2 (n) 2n2 log2 (n) n2 log2(n) c2 c2 c2 c1 + + + w (1.4.26) 2 2n 2n log2 (n) log2(n)
≤
≤ ≤
27
Prog. Prog. III
1.4. OTROS OTROS EJEMPL EJEMPLOS OS
Dado que la parte izquierda de la desigualdad es una funci´on on decreciente, con n0 = 2 se tiene que se cumple la definici´ on on de BigOh, donde T ( T (n) wn2 log2 (n), n 2.
≤
∀ ≥
c2 c2 c2 c1 c2 c2 c2 c 1 + + + = + + + = c 2 + c + c1 = w = w(1.4.27) (1.4.27) 2 4 4log2 (2) log2(2) 2 4 4 1 Por lo tanto se demuestra que el T ( T (n) es efectivamente
2
O(n
1.4. 1.4.2. 2.
log2 (n)).
Eje Ejemplo mplo 10
Sea el siguiente programa, a. Calcula Calcularr su T su T ((n), detallando los pasos seguidos para llegar al resultado. resultado. f (n)) justificando usando la definici´ on on de BigOh. O(f (
b. Calcula Calcularr su
1 p u bl b l ic i c s t a t i c v oi oi d f ( i n t n ) 2 sum=0, sum1=0, sum1=0, sum2=0; sum2=0; i n t sum=0, 3 =1; i <= n ; i += += 0 . 5 ) f o r ( double i =1; 4 ++sum1 ; 5 =1; j <= sum sum11 ; j++ j++) f o r ( double j =1; 6 sum2++; 7 k=j ; k <= sum1 sum1 ; k++) f o r ( double k=j 8 sum += sum1 + su m2 ; 9 10 11 12 return sum; 13
{
{
{
}
}
{
}
}
Antes de empezar
Para plantear inicialmente este ejercicio hace falta analizar el programa. Una estrategia interesante para resolver este tipo de ejercicios consiste en reescri reescribir bir los l´ımites ımites de los bucles, bucles, a fin de consegui conseguirr un program programaa que se ejecute la misma cantidad de veces que el original y calcule los mismos valores con el mismo resultado, pero que sea m´as as f´acil acil para analizar. Por ejemplo, los programas F1 y F2 son equivalentes en cuanto al valor calculado calculado y cantidad cantidad de veces que se ejecuta cada bucle, solo var´ ar´ıan en sus constantes: 28
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
1 p u bl b l ic i c s t a t i c v o iid d F1 ( i n t n ) 2 int x = 0 ; 3 0 ; i <= 1 0 n ; i += 1 0) 0) f o r ( i n t i = 1 0; 4 x += a l g o d e O 1 ( i ) ; 5 6 return x ; 7
Prog. Prog. III
{
{
}
}
1 p u bl b l ic i c s t a t i c v o iid d F2 ( i n t n ) 2 int x = 0 ; 3 ++) f o r ( i n t i = 1 ; i <= n ; i ++ 4 x += a l g o d e O 1 ( i 1 0 ) ; 5 6 return x ; 7
{
{
}
}
Al momento de escribir el tiempo de ejecuci´ on de los programas, se pueden on tener: 1. Sumatorias Sumatorias que sus variables variables tomen los mismos valores valores que los bucles del programa. 2. Sumatorias que tengan la misma cantidad de t´erminos erminos que la cantidad de veces que se ejecuta cada bucle del programa. Estas dos estrategias estrategias son equivalen equivalentes tes entre s´ s´ı. Por esto, el tiempo de ejecuci´on on de ambas funciones F1 y F2 anteriores es: F ( F (n) = C 1 + C + C 2 n + C + C 3
(1.4.28)
Donde C 1 , C 2 , C 3 son constantes constantes que su valor depende de la versi´ versi´on on del programa se est´ a analizando, ya sea F1 o F2. Ejercicio
A partir de esto podemos decir: El for con con ´ındi ın dice ce i se ejecuta 2 * n - 1 veces. La variable sum1 cuenta la cantidad de veces que se ejecuta el primer for. Su valor comienza en 1 y termina en 2 * n - 1 . 29
Prog. Prog. III
1.4. OTROS OTROS EJEMPL EJEMPLOS OS
El for con co n ´ındi ın dice ce j j se ejecuta tantas veces como vale la variable sum1. Dado que el valor de la variable sum1 va cambiando a medida que se ejecuta el programa, programa, no es correcto decir que ´este este for se ejecuta 2 * n veces, porque n siempre vale lo mismo pero sum1 no. El for con con ´ındi ın dice ce k se ejecuta sum1 - j + 1 veces. Dado que el ´ındice ındic e i del primer for no se utiliza sino solo para contar (y no aparece en ning´ un otro lugar del programa) podemos cambiar el un primer for (co ( con n ´ındi ın dice ce i) por esto otro: 1; i <= ( 2 f o r ( i n t i = 1;
n
− 1);
i ++ ++)
.. .
{
Con este cambio conseguimos que la variable i tome el mismo valor que la variable sum1, manteniendo manteni endo que ´este este for se ejecute la misma cantidad de veces que el for original. A partir de este an´ alisis, podemos definir la funci´on alisis, on de tiempo: 2n−1
´ CAP ´ ITULO ITULO 1. TIEMPO TIEMPO DE EJECU EJECUCI CI ON
2n−1
2n
− 2
i2
i =
i=1
1 T ( T (n) = c 1 2
1 2
(4n (4n2 + 2n 2n)(4n )(4n + 1) 6
2
− (2n (2n) 2
− 4n
+
16n 16n3 + 4n 4n2 + 8n 8n2 + 2n 2n 6
− 4n
16 3 4 2 8 2 2 n + n + n + n 6 6 6 6
− 4n
1 T ( T (n) = c1 2
(2n (2n)2
1 T ( T (n) = c 1 2
2
+
−
(2 ( 2n
− 1)(2n 1)(2n) 2
4n 4 n2
− 2n
2
4n 4 n2
+
2
(1.4.39)
(1.4.40)
(1.4.41)
1
(1.4.37) (1.4.38)
− 22 n
2 n 3
− c 23 n
− 2n
4 + n2 2
2
16 3 n 6
4 T ( T (n) = c 1 n3 3 Demostraci´ on on del orden
(1.4.36)
i=1
(2n (2n)((2n )((2n) + 1)(2(2n 1)(2(2n) + 1) 6
1 T ( T (n) = c 1 2
T ( T (n) = c 1
Prog. Prog. III
(1.4.42)
f (n)) O(f (
Se elige el t´ermino ermino de mayor orden: g (n) = n 3 f ( f (n) es de (g(n)) si y solo si w tal que f ( f (n) ¿T ( T (n) es de (n3 )?
O O
∃
4 c1 n3 3
wg (n), ∀ n ≥ n . ≤ wg( 0
− c 23 n ≤ wn ∀n ≥ n 3
1
0
(1.4.43)
4n3 2n c1 3 c1 3 w (1.4.44) 3n 3n 4 2 c1 c1 2 w (1.4.45) 3 3n Dado que la parte izquierda de la desigualdad es una funci´on on decreciente, con n0 = 1 se tiene que se cumple la definici´ on on de BigOh, donde T ( T (n) wn3 , n 1.
−
≤
−
≤
≤
∀ ≥
4 2 2 c1 = c1 3 3 3 Por lo tanto se demuestra que el T ( T (n) es efectivamente w = c = c1
(1.4.46)
−
3
O(n ).
31
Prog. Prog. III
1.5. IDENTIDA IDENTIDADES DES DE SUMATORIA SUMATORIAS S Y LOGARITMOS LOGARITMOS
1.5. 1.5.
Iden Identi tida dade dess de sumat sumator oria iass y loga logari ritm tmos os n
a log = log a log b b log(a log(a b) = log a + log b logb (ba ) = b logb a = a c ab = a bc = (ac )b
−
×
32
Cap´ıtulo 2 Listas
33
´ 2.1. LOS PARE PARES S DEL FARA FARAON
2.1. 2.1.
Prog. Prog. III
Loss Par Lo Pares es del del Far Fara´ a´ on on
Entre todas sus fascinaciones, al Fara´ on on le atrae a trae la idea de ver qu´e grupos de objetos a su alrededor se pueden dividir en dos grupos de igual tama˜ no. no. Como Ingeniero/a del Fara´ on, es tu tarea escribir un programa en Java on, que, a partir de una lista que representa la cantidad de elementos de cada grupo, le permita al Fara´ on on descubrir cu´ antos grupos se pueden dividir en antos dos sin tener un elemento sobrante (ni tener que dividir el elemento sobrante por la mitad). int contar ( ListaDeEnteros L)
2.1.1 2.1.1..
{
.. .
}
Expl Explic icac aci´ i´ on on del problema
Se tiene una lista de n´ umeros enteros, y hay que devolver la cantidad de umeros n´umeros umeros pares que aparecen en la lista. El objetivo de este ejercicio es poner en pr´ actica los conceptos de abstraactica ci´on, on, teniendo un tipo abstracto que representa una secuencia de elementos sin importar imp ortar de qu´e forma fo rma se representa internamente la estructura. Es importante importante tener en cuenta que las listas se recorren con los m´etodos etodos presentes en la pr´ actica, sin acceder directamente al arreglo o nodos interioactica, res.
34
CAP ´ ITULO ITULO 2. LISTAS LISTAS
2.1.2 2.1.2..
Prog. Prog. III
Impl Implem emen enta taci ci´ ´ on on Java
1 int contar ( ListaDeEnteros L) 2 int c a n t i d a d = 0 ; 3 4 L . c o m e n z ar ar ( ) ; 5 while ( ! L . f i n ( ) ) 6 t o ( ) % 2 ) == 0 ) i f ( ( L . e l e m e n to 7 c a n t i d a d ++; 8 L . proximo ( ) ; 9 10 11 return c a n t i d a d ; 12
{
{
}
}
35
Prog. Prog. III
2.2. PILAMI PILAMIN N
2.2.
PilaMin
(a) Implementar Implementar una clase clase PilaDeEnteros donde donde todas to das las operaciones sean de tiempo constante (1).
O
(b) Implementar Implementar una una subclase PilaMin subclase PilaMin que que permita pe rmita obtener obte ner el m´ınimo ınimo elemento presente pr esente en la estructura, e structura, tambi´ en en en tiempo constante (1).
O
1 class PilaDeEnteros 2 ... public public vo void id p o n e r ( i n t e ) 3 ... p u bl bl ic ic i n t s a c a r ( ) 4 ... p u bl bl ic i c i n t tope () 5 ... public boolea boolean n esVacia () 6 7 8 c l a s s PilaMin extends P i l a D e E n t e r o s 9 ... p u bl bl ic i c i n t min() 10
{
{ } { }
} }
2.2.1 2.2.1..
{ } { }
{ }
{
Expl Explic icac aci´ i´ on on del problema
La implementaci implementaci´ on o´ n de PilaDeEnteros PilaDeEnteros utiliza internamen internamente te una una ListaDeEnteros para DeEnteros para almacenar los elementos de la estructura. De esta forma, la lista se utiliza agregando y eliminando eliminando de la pila siempre en el mismo extremo, ya sea siempre al comienzo de la estructura, o siempre al final. Sim embargo, dependiendo de la implementaci´ implementaci´ on on concreta de ListaDeEnde ListaDeEnteros elegida, teros elegida, la eficiencia ser´a diferente. Utilizando una ListaDeEnterosCouna ListaDeEnterosConArreglos , para insertar al comienzo del arreglo es necesario hacer el corrimiento de todos los elementos de la estructura, teniendo orden lineal (n), con n en tama˜ no no de la estructua. Algo similar ocurre en una ListaDeEnterosEnlazada una ListaDeEnterosEnlazada , donde para insertar al final de la estructura es necesario recorrerla desde el comienzo para hacer los enganches de los nodos al final. Insertar un elemento a final de una lista enlazada simple es e s tambi´ t ambi´ en en una operacion de orden (n). De todas formas, es posible conseguir acceso de tiempo constante en una lista. En un arreglo, insertar y eliminar un elemento al final es una operaci´on on de tiempo constante, ya que sin importar la cantidad de elementos ni la posici´ on a la que se accede, se puede acceder directamente y no hace falta on hacer ning´ un corrimiento de elementos. un
O
O
36
CAP ´ ITULO ITULO 2. LISTAS LISTAS
Prog. Prog. III
En una lista enlazada simple, insertar y eliminar en el comienzo es tambi´ bi´en en de tiempo tiempo constan constante, te, ya que solo solo hace falta falta hacer hacer los enganch enganches es del primer nodo de la estructura junto con la referencia al primer elemento, sin importar cu´ antos elementos contiene la estructura. antos
2.2.2 2.2.2..
Impl Implem emen enta taci ci´ ´ on on Jav Java - Versi´ ersi´ on on con Lista Enlazada
class PilaDeEnteros private L i s t a D e E n t e r o s E n l a z a d a L = new new
{
ListaDeEn terosEnla zada () ; public public vo void id p o n e r ( i n t e )
L . comenzar ( ) ; L . a g r e g a r ( e ) ; /
{
Tiemp iempoo ct e .
/
} p u bl bl ic ic i n t s a c a r ( ) int x ;
{
L . comenzar ( ) ; x = L. elemento () ; L . e l i m i n a r ( ) ; / Tiemp iempoo ct e .
/
} p u bl bl ic i c i n t tope ()
{
L . comenzar ( ) ; return L. eleme nto () ; /
Tiem Tiempo po ct e .
/
} public boolea boolean n esVacia () return (L . tamanio () == 0) ; /
{
}
Tiem Tiempo po ct e .
/
}
2.2.3 2.2.3..
O(1)
Pila PilaMi Min, n, meno menor r eleme elemen nto en tie tiempo mpo
La operaci´ on on para obtener el m´ınimo elemento de la estructura tambi´en en debe ser de tiempo constante, por lo que recorrer la lista cada vez que se consulta el m´ınimo no es correcto. Tampoco ampo co es correcto c orrecto agregar una variable que acumule el m´ınimo entero e ntero agregado, porque si bien funciona mientras se le agregan elementos a la pila, 37
Prog. Prog. III
2.2. PILAMI PILAMIN N
cuando se elimina un elemento de la pila ya pierde su valor. Por ejemplo: c l a s s PilaMin extends P i l a D e E n t e r o s .MAX VALUE; i n t minelem = I n t e g e r .MA public public vo void id p o n e r ( i n t e )
{
{
/ VERSION INCORREC INCORRECTA TA / minelem m ) minel minelem em = e ; i f ( e < minele er ( e ) ; super . p o n er
} p u bl bl ic i c i n t min()
{
/ VERSION INCORREC INCORRECTA TA return minelem ;
}
/
}
Es posible posible obtener obtener el m´ınimo ınimo elemen elemento to en tiempo tiempo constan constante te sin tener tener que recorrer la lista. A medida que se van agregando elementos, el nuevo menor es el menor elemento entre el menor actual y el nuevo elemento que se est´a agregando. Pero cuando se eliminan elementos, el menor debe pasar a ser el que estaba antes de agregarlo a la pila. Por lo tanto, se puede crear una segunda pila que contenga la misma cantidad de elementos y en la que se vaya apilando el menor en cada paso. Entonces, el menor ser´a el que est´e en el tope t ope de la segunda pila. Cuando se elimina un elemento de la estructura tambien es necesario eliminarlo de la pila de minimos.
38
CAP ´ ITULO ITULO 2. LISTAS LISTAS
Prog. Prog. III
/
V er e r si s i on o n f i n a l c o r r e c ta t a . / c l a s s PilaMin extends P i l a D e E n t e r o s p ri ri va v a te te s t a t i c i nt n t MIN( i n t a , i n t b ) return ( a < b ) ? a : b ;
{
{
} P i l a D e E n t e r o s m in in im im os os = new new PilaDeEnt eros () ; public public vo void id p o n e r ( i n t e ) i f ( esV acia () )
{
minimo minimoss . poner ( e ) ; else
minimos . pon er (MI (MIN( e , minimos . to pe () ) ) ; er ( e ) ; super . p o n er
} p u bl bl ic ic i n t s a c a r ( )
{
minimos minimos . sa ca r () ; return return super super . saca r () ;
} p u bl bl ic i c i n t min() return minimos . to pe ( ) ;
{
}
}
39
Prog. Prog. III
2.2. PILAMI PILAMIN N
40
Cap´ıtulo 3 ´ Arboles binarios y Generales
41
´ ´ 3.1. EVALUA EVALUAR R ARBOL DE EXPRESI ON
3.1.
Prog. Prog. III
Evalua Evaluar r´ arbol arbol de expresi´ expresi´ on on
Dado un arbol a´rbol de expresi´on, on, implementar en Java una funci´on on que calcule el valor de la expresi´on. on. El ´arbol arbol ya se encuentra construido, es de String y la funci´on on ser´a: a: f l o a t eva lua r ( ArbolBina rio < S t r i n g > a )
{
.. .
}
a´rbol 2 + 3 * 4, la funci´ on on deber´ a devolver el valor 14. Ejemplo: Dado el arbol
3.1.1 3.1.1..
Expl Explic icac aci´ i´ on on del problema
El arbol ´arbol es de Strings porque hay diferentes tipos de nodos: operadores, y valores. Los operadores pueden ser +, +, , , /, y los valores son n´ umeros. umeros. Dado que cualquier cualquier subarbol de un arbol a´rbol de expresi´ expresion o´n es tambi´ ta mbi´en en un arbol a´rbol de expresi´ on, on, la forma m´as as f´acil acil y directa de resolverlo es de forma recursiva. Si el ´arbol arbol est´a vac´ vac´ıo se dispara dispar a un NullPointerException NullPointerException en la primer llamada, pero dado que el arbol a´rbol ya viene correctamente construido como un arbol ´arbol de expresi´ on, todos los nodos operadores tendr´ on, an an dos hijos, y los nodos de valores ser´an an hojas.
−×
3.1.2 3.1.2..
Impl Implem emen enta taci ci´ ´ on on Java
1 f l o a t eva lua r ( ArbolBina rio A) 2 S t r i n g d = A . g et e t Da D a to t o Ra R a iz iz ( ) ; 3 A r b o l B i n a r io i o I = A . g e t H i j o I z q u i e r d o ( ) ; 4 A r b o l B i n a r io i o D = A. getHij oDere cho () ; 5 6 i f (d . eq ua ls ( ”+” ) ) 7 return eva lua r ( I ) + eva lua r ( D) ; 8 i f ( d . e q u a l s ( ” ” ) ) 9 ev al ua r (D) (D) ; return ev al ua r ( I ) 10 i f ( d . e q u a l s ( ” ” ) ) 11 ev al ua r (D) (D) ; return ev al ua r ( I ) 12 i f ( d . e q u a l s ( ” / ” ) ) 13 return eva lua r ( I ) / eva lua r ( D) ; 14 15 return Float . par seF loa t (d ) ; 16
{
−
−
}
42
´ CAP ´ ITULO 3. ARBOLES BINARIOS Y GENERALES
3.2.
Prog. Prog. III
M´ınimo del Nivel Nivel
Implementar en e n Java Java una funci´on on que dado un arbol a´rbol binario de enteros y un n´ umero umero de nivel, nivel, permita calcular calcular el m´ınimo valor del nivel nivel indicado. indicado. Considere la ra´ ra´ız como nivel cero. c ero. i n t calcula rMinimo ( ArbolBina rio a , i n t
numeroNivel)
3.2.1 3.2.1..
{
.. .
}
Expl Explic icac aci´ i´ on on del problema
Hay dos formas diferentes de encarar este problema: de forma recursiva, y de forma iterativa. Ambas son simples de entender y correctas, dando el resultado esperado. En la forma recursiva hace falta pasar por par´ ametro ametro el arbol a´rbol y el numero de nivel actual. Cuando se llega al nivel esperado hay que devolver el valor actual, y cuando se regresa de la recursi´ on hay que comparar los minimos on entre los hijos izquierdo y derecho del nodo actual. En la forma iterativa hace falta recorrer por niveles el arbol, contando el nivel actual con la marca de null. Cuando se llega al nivel esperado hay que buscar entre todos los valores desencolados el m´ınimo de ellos. Una vez que se terminaron los elementos o se lleg´ o a un nivel m´as as que el buscado hay que cortar la b´ usqueda. usqueda. En ambos casos, hace falta verificar que el nivel realmente exista. Una forma de transmitirlo es devolviendo null cuando no se encontr´ o el valor. Esto solo se puede cuando se usa Integer como tipo de datos; usando int como tipo de datos de retorno no es posible devolver null. En el caso de usar int se puede usar la constante Integer.MAX VALUE para indicar que el valor no se encontr´ o. o. En Java, el operador ternario signo de pregunta ”?:” es un if reducido. La parte de la izquierda es la condici´ on, on, cuando es true se devuelve el valor del medio, y cuando es false se devuelve lo que hay a la derecha del dos puntos. Por ejemplo, la siguiente funci´ on on devuelve el m´aximo aximo entre los valores recibidos por par´ ametro: ametro: 1 2 3
i n t obtenerMaximo( i n t A, i n t B) return (A > B ) ? A : B ;
}
43
{
3.2. 3.2. M ´ INIMO DEL NIVEL
3.2.2 3.2.2..
Prog. Prog. III
Impl Implem emen enta taci ci´ ´ on Java - Recursivo con Integer on
1 I n t e g e r c a l c u la l a r M i n im i m o ( A r b o lB l B i n a ri r i o< o A, i n t numeroNivel) 2 (A) ) i f ( es Va ci o (A) 3 retu return rn null ; 4 == 0) i f ( numeroNivel == 5 return A. getDato Raiz () ; 6 7 I n t e g e r m i n I = c al a l cu c u la l a r Mi M i ni n i mo m o ( A . g e t H i j o I z q u ie ie r d o ( ) , numeroNivel 1) ; 8 I n t e g e r minD = c a l c u l ar a r M i n im i m o ( A . g e t H i jo jo D e r e c h o ( ) , numeroNivel 1) ; 9 10 / m in in I y mi minD p u uee de d e n s e r n u l l / 11 in I ! = null && && minD minD != null ) i f ( m in 12 minI : minD; return (minI < minD) ? minI 13 e l s e 14 in I ; return (minI == null ) ? minD : m in 15
{
− −
}
3.2.3 3.2.3..
Impl Implem emen enta taci ci´ ´ on Java - Recursivo con int on
1 / Devuelve In te ge r .MA .MAX VALUE cuando cuando no se encuentra 2 i n t calcula rMinimo ( ArbolBina rio A, i n t numeroNivel) 3 (A) ) i f ( es Va ci o (A) 4 return Integer .MAXVALUE; 5 == 0) i f ( numeroNivel == 6 return A. getDato Raiz () ; 7 8 in I = c a l c u l a r M i n i m o (A . g e t H i j o I z q u i e r d o ( ) , i n t m in numeroNivel 1) ; 9 i n t minD = calcula rMinimo ( A. getHij oDere cho () , numeroNivel 1) ; 10 11 return (minI < minD) ? minI minI : minD; 12
{
− −
}
44
/
´ CAP ´ ITULO 3. ARBOLES BINARIOS Y GENERALES
3.2.4 3.2.4..
Prog. Prog. III
Impl Implem emen enta taci ci´ on ´ on Java - Iterativo