Edición de «Final 10/03/17 (Algoritmos II)»

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 1: Línea 1:
Esteban Feuerstein
Esteban Feuerstein
4 hs


Para considerarse aprobado deben estar bien al menos 3 ejercicios.
Para considerarse aprobado deben estar bien al menos 3 ejercicios.
Línea 12: Línea 11:
* d) Si un enunciado dice "Siempre que vale A sucede inmediatamente B y B no puede suceder de ninguna otra manera" y la correspondiente axiomatización incluye las operaciones A y B entonces el TAD está mal escrito.
* d) Si un enunciado dice "Siempre que vale A sucede inmediatamente B y B no puede suceder de ninguna otra manera" y la correspondiente axiomatización incluye las operaciones A y B entonces el TAD está mal escrito.


=== Soluciones(no corregidas por un prof.) ===
a) Falso: Cualquier operación podría escribirse en base a los generadores, aunque no es recomendable. Que un observador básico deba escribirse en base a los generadores es sólo una consecuencia de serlo. Pero lo que define un observador básico es su capacidad de dividir el universo de instancias del tipo en clases de equivalencia.
b) Verdadero
c) Falso: Cualquier operación que distinga instancias del TAD debe pertenecer al conjunto de observadores básicos o no existir, porque el TAD debe ser una congruencia.
d) Verdadero: es comportamiento automático.


== Ejercicio 2 ==
== Ejercicio 2 ==
En cada uno de los siguientes escenarios, indique qué método de ordenamiento de los estudiados en clase utilizaría y porque.
En cada uno de los siguientes escenarios, indique qué método de ordenamiento de los estudiados en clase utilizaría y porque.


* a) Se tiene un arreglo de naturales A[1..n] y se desea ordenarlos (de mayor a menor) solamente sí la suma de los k elementos más grandes es menor que X. Se desea realizar ésta tarea de forma eficiente, dandola por terminada lo antes posible si la condición no se cumple. (La verificación forma parte de la tarea, no se debe verificar la condición antes de empezar a ordenar)
* a) Se tiene un arreglo de naturales A[1..n] y se desea ordernarlos (de mayor a menor) solamente sí la suma de los k elementos más grandes es menor que X. Se desea realizar ésta tarea de forma eficiente, dandola por terminada lo antes posible si la condición no se cumple. (La verificación forma parte de la tarea, no se debe verificar la condición antes de empezar a ordenar)


* b) Se tiene un arreglo redimensionable de naturales A[1..n] y se desea ordenarlos. Sin embargo, durante el proceso de ordenamiento es posible que se agreguen nuevos elementos al final del arreglo.
* b) Se tiene un arreglo redimensionable de naturales A[1..n] y se desea ordenarlos. Sin embargo, durante el proceso de ordenamiento es posible que se agreguen nuevos elementos al final del arreglo.


=== Soluciones ===
a) Hacer max_heapify del arreglo, sumar los k primeros, y en base a eso decidir si ordenar o no. Esto sería <math> O(N + K * log(N)) </math> en el caso que no haya que ordenar, <math> O(N * log(N)) </math> para cuando sí haya que ordenar.


b) Usaría un Heap Sort, ya que permite ordenar el arreglo en <math>O(n*log(n))</math>, y la inserción cuesta solamente <math>O(log(n))</math>. No se me ocurre un método mejor.


== Ejercicio 3 ==
== Ejercicio 3 ==
Línea 40: Línea 27:
Sea S el arreglo de claves representado por como un max-heap.  
Sea S el arreglo de claves representado por como un max-heap.  


* a) Sean S[i] y S[j] claves del heap / i < j y S[i] < S[j] → el arreglo obtenido al intercambiar S[i] y S[j] sigue siendo max-heap.
a) Sean S[i] y S[j] claves del heap / i < j y S[i] < S[j] → el arreglo obtenido al intercambiar S[i] y S[j] sigue siendo max-heap.
 
* b) Sean S[i] y S[j] claves del heap / i < j y S[i] > S[j] → el arreglo obtenido al intercambiar S[i] y S[j] sigue siendo max-heap.


=== Soluciones ===
b) Sean S[i] y S[j] claves del heap / i < j y S[i] > S[j] → el arreglo obtenido al intercambiar S[i] y S[j] sigue siendo max-heap.
a) <b>Falso</b>. Un contraejemplo sería el del heap representado por el arreglo [10, 3, 9, 2, 1, 8, 7]. Si tomamos i = 2 y j = 3, S[i] = 3 y S[j] = 9 => i < j y S[i] < S[j]. Si intercambiamos S[i] con S[j], los hijos del nodo con valor 3 pasarían a ser los antiguos hijos del nodo con valor 9, que eran los nodos con valores 8 y 7. Como 8 y 7 son mayores que su nuevo padre 3, el invariante del max-heap se pierde.


b) <b>Falso</b>. El contraejemplo es muy parecido al anterior. Tomemos el heap representado por el arreglo [10, 9, 3, 8, 7]. Si tomamos i = 2 y j = 3, S[i] = 9 y S[j] = 3 => i < j y S[i] > S[j]. Si intercambiamos ahora los dos valores, el nodo con valor 3 pasará a ser el padre de los nodos con valores 8 y 7, y se romperá la invariante del max-heap.


== Ejercicio 4 ==
== Ejercicio 4 ==
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)