Edición de «Práctica 3: Técnicas Algorítmicas (Algoritmos III)»

De Cuba-Wiki
Advertencia: no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si inicias sesión o creas una cuenta, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.

Puedes deshacer la edición. Antes de deshacer la edición, comprueba la siguiente comparación para verificar que realmente es lo que quieres hacer, y entonces publica los cambios para así efectuar la reversión.

Revisión actual Tu texto
Línea 51: Línea 51:
Mover(k, j, i, n-1)
Mover(k, j, i, n-1)
</pre>
</pre>
<br>b) para demostrar la correctitud del algoritmo, lo podemos hacer por inducción basándonos que en n pasos nuestro algoritmo deja n-discos en la pila 3 de la forma correcta(es decir, el mas pesado debajo de todo y así con los de menor peso).
<br>b)
CB: Muevo un disco de la pila 1 a la pila 3, vale.
PI: Se asume que se dejaron n-1 discos correctamente ubicados en la pila 3, por lo que solo me queda mover un disco de la pila 1 a la 3, y como en esta ultima el orden era el correcto, vale para todo n.
Lo importante a notar es que el algoritmmo mantiene invariante lo que realiza paso a paso, es decir, hace un montón de movimientos entre los distintos discos pero al final de cuentas los termina dejando acomodas en orden correcto en la pila3.
<br>c) O(2^n)
<br>c) O(2^n)
<br>d) Como son 64 discos, el número de movimientos es 2^64 - 1 = 18446744073709551615. Si suponemos que los monjes tienen la suficiente habilidad como para hacer un movimiento en un segundo, en un día harán 60*60*24 movimientos. Y en un año de 365 días: 60*60*24*365. Dividimos el número de movimientos por el resultado de la operación anterior y nos debe dar, aproximadamente, medio billón de años. Sólo falta averiguar cuantos años se estiman que el hombre lleva sobre la tierra y sabremos el tiempo que le queda sobre ella (TSUNAMI DE CHANES!!)
<br>d) Como son 64 discos, el número de movimientos es 2^64 - 1 = 18446744073709551615. Si suponemos que los monjes tienen la suficiente habilidad como para hacer un movimiento en un segundo, en un día harán 60*60*24 movimientos. Y en un año de 365 días: 60*60*24*365. Dividimos el número de movimientos por el resultado de la operación anterior y nos debe dar, aproximadamente, medio billón de años. Sólo falta averiguar cuantos años se estiman que el hombre lleva sobre la tierra y sabremos el tiempo que le queda sobre ella (TSUNAMI DE CHANES!!)
Línea 76: Línea 73:
</pre>
</pre>
<br>b)
<br>b)
<br>c) usando Teorema Maestro tenemos:  T(n) = 2 * T(n/2) + n^2, que entra en el tercer caso, quedándonos: O(n^2)
<br>c) O(n log n)


==Ejercicio 03.04==
==Ejercicio 03.04==
Línea 159: Línea 156:
Conclusion: V = G
Conclusion: V = G


<br>b) Si tomamos por ejemplo un vuelto de 15 centavos, el goloso nos daria el siguiente resultado: 15 = 1 moneda de 12 cent. + 3 de 1 cent, o sea 4 monedas.
<br>b)
Usando otro criterio, y asumiendo que cuento con monedas de 10 y 5 centavos, puedo dar el vuelto con 2 monedas: 15 = 1 moneda 10 centavos + 5 centavos.
Por lo tanto el criterio goloso no encuentra la solución óptima en este contexto.


==Ejercicio 03.07==
==Ejercicio 03.07==
Línea 230: Línea 225:
   
   
<br>b) O(n*k)
<br>b) O(n*k)
<br>c) Se pueden usar 2 variables auxiliares con el fin de ir guardandome los calculos necesarios para calcular cada termino de fibonacci, hago un pseudocodigo:
<br>c) Mira vos
 
<pre>
fibo(n)
        si n == 0 o n == 1, devolver 1 //caso base
        sino
            termino1 = 1, termino2 = 1
            para i desde 2 hasta n,
            hacer:
                  suma = termino1 + termino2;
                  termino2 = termino1l;
                  termino1 = suma;
            fin para
        devolver termino1;
 
Como programación dinámica es botton up, voy construyendo la solución de menor termino hasta el n-esimo.
</pre>


==Ejercicio 03.08==
==Ejercicio 03.08==
Línea 253: Línea 232:
Nota: costo=int, pred: <int,int>
Nota: costo=int, pred: <int,int>
camMinimo(int M[m][n])
camMinimo(int M[m][n])
  Tupla<costo, pred> R[m][n];
Tupla<costo, pred> R[m][n];
  Lista<int, int> camino;
Lista<int> camino;


  R(1,1)=< M[1,1], <0,0> >;
R(1,1)=< M[1,1], <0,0> >;
  R(f,1)=< Σ{i=1..f} M[i,1], <f-1,1> >;
R(f,1)=< Σ{i=1..f} M[i,1], <f-1,1> >;
  R(1,c)=< Σ{i=1..c} M[1,i], <1,c-1> >;
R(1,c)=< Σ{i=1..c} M[1,i], <1,c-1> >;


  para f=2..m
para f=2..m
    para c=2..n
para c=2..n
      si (R[f,c-1].costo < R[f-1,c].costo)
si (R[f,c-1].costo < R[c-1,f].costo)
        R[f,c].costo = R[f,c-1].costo+M[f,c];
R[f,c].costo = R[f,c-1].costo+M[f,c];
        R[f,c].pred = <f,c-1>;
R[f,c].pred = <f,c-1>;
      sino
sino
        R[f,c].costo = R[f-1,c].costo+M[f,c];
R[f,c].costo = R[f-1,c].costo+M[f,c];
        R[f,c].pred = <f-1,c>;
R[f,c].pred = <f-1,c>;


res = R[m,n].costo;
res = R[m,n].costo;
sig = <m,n>;
sig = <m,n>;
mientras (R<sig>.pred != <0,0>) // reconstruyo camino
mientras (sig.pred != <0,0>) // reconstruyo camino
camino = R<sig>.pred U camino;
camino = sig.pred U camino;
sig = R<sig>.pred;
sig = sig.pred;
</pre>
</pre>
<br>b) O(m*n)tanto temporal como espacial.
<br>b) O(m*n)tanto temporal como espacial.
Línea 287: Línea 266:


==Ejercicio 03.09==
==Ejercicio 03.09==
<br>a) Primero pensemos en la funcion recursiva. TIP: veamos la version booleana y luego si sale, se puede hacer la version con los operandos.
<br>a)
 
<br>b)
i es el indice del vector v de valores a los cuales se les van a aplicar los operandos.
           
f(i,w) = {  true si i=1 y W=v1
            false si i = 1 y W !=v1
            f(i-1,w-vi) || f(i-1, w/ri) || f(i-1, nroot(w)) //hacemos un or
 
<br>b) Se puede ahcer pseudo-polinomial en O(nW)
 
==Ejercicio 03.10==
==Ejercicio 03.10==


Línea 586: Línea 557:
==Ejercicio 03.12==
==Ejercicio 03.12==
==Ejercicio 03.13==
==Ejercicio 03.13==
<br>a) no es optimo ya que se puede realizar con solo 2 operaciones. Insertando una 'c' entre las 'b' y borrando la ultima 'a'.
<br>a)
<br>b)
<br>b)
<pre>
<pre>
Ten en cuenta que todas las contribuciones a Cuba-Wiki pueden ser editadas, modificadas o eliminadas por otros colaboradores. Si no deseas que las modifiquen sin limitaciones, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre (véase Cuba-Wiki:Derechos de autor para más detalles). ¡No uses textos con copyright sin permiso!

Para editar esta página, responde la pregunta que aparece abajo (más información):

Cancelar Ayuda de edición (se abre en una ventana nueva)

Plantilla usada en esta página: