Edición de «Final 03/05/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:
{{back|Algoritmos_y_Estructuras_de_Datos_II}}
Tomado por Esteban Feuerstein, corregido por Fernando Schapachnik.
 
 
[[Archivo:Final-algo2-03-05-2017-parte1.jpeg|500px]]


Tomado por Esteban Feuerstein, corregido por Fernando Schapachnik.


Para aprobar: como mínimo 3 ejercicios BIEN
Para aprobar: como mínimo 3 ejercicios BIEN
Línea 41: Línea 43:
     top: pila -> indicador
     top: pila -> indicador
     hay_elem?: indicador -> bool
     hay_elem?: indicador -> bool
     elem: pila x indicador i -> elem { hay_elem?(i) }
     elem: pila x indicador i -> elem { hay_elem?(i) }  
 
=== Soluciones ===
 
a) El TAD no es correcto. El error se encuentra en que las operaciones podrían generar un frasco con diferentes observadores que el que genera el único generador que hay. Si se llama a <code>aportar_calorías</code>, por ejemplo, el observador <code>volumen_agua</code> del nuevo frasco debería tener como valor uno mayor al original, pero eso no se puede lograr con el único generador existente.
 
La forma de arreglarlo sería convertir una de las operaciones en generador.
 
Además, las operaciones <code>disminuir hielo</code> y <code>incrementar_agua</code> no respetan el comportamiento automático que el enunciado da a entender.
 
b) El TAD podría estar mejor. En la operación <code>empujar</code> no hace falta que se pasen la distancia y el i, ya que una determina la otra inequívocamente. Lo arreglaría tener solo como parámetro uno de los dos.


== Ejercicio 2 ==
== Ejercicio 2 ==
Supongamos que extendemos el TAD Diccionario agregándole una operación RestricciónDeRango(x,y), con x<=y, que elimina del diccionario todos los valores que son menores que x o mayores que y. Por ejemplo, si las claves son reales, luego de una operación RestricciónDeRango(x,y) el diccionario contendría solamente las claves en el intervalo cerrado [x,y]. Proponga una estructura de datos para implementar eficientemente tanto las operaciones tradicionales de diccionario como la nueva operación, considerando los siguientes casos:
Supongamos que extendemos el TAD Diccionario agregándole una operación RestricciónDeRango(x,y), con x<=y, que elimina del diccionario todos los valores que son mayores que x o menores que y. Por ejemplo, si las claves son reales, luego de una operación RestricciónDeRango(x,y) el diccionario contendría solamente las claves en el intervalo cerrado [x,y]. Proponga una estructura de datos para implementar eficientemente tanto las operaciones tradicionales de diccionario como la nueva operación, considerando los siguientes casos:


a) Se puede asumir que x e y están en el diccionario.
a) Se ruede asumir que x e y están en el diccionario.


b) No se puede asumir que x e y están en el diccionario.
b) No se puede asumir que x e y están en el diccionario.  


=== Soluciones ===
a) Skip-list?


b) Skip-list?
[[Archivo:Final-algo2-03-05-2017-parte2.jpeg|500px]]


== Ejercicio 3 ==
== Ejercicio 3 ==
Línea 75: Línea 66:
== Ejercicio 5 ==
== Ejercicio 5 ==
Suponiendo que un programador tiene un error en una implementación de un diccionario con hashing doble, de modo que una de las dos funciones devuelve el mismo valor (distinto de 0), describir lo que sucede en cada situación (cuando es la primera función la que está mal y cuando lo es la segunda).
Suponiendo que un programador tiene un error en una implementación de un diccionario con hashing doble, de modo que una de las dos funciones devuelve el mismo valor (distinto de 0), describir lo que sucede en cada situación (cuando es la primera función la que está mal y cuando lo es la segunda).
=== Solución ===
En el hashing doble, el hash se calcula como <math>h(k,i) = (h_1(k) + i * h_2(k)) mod |T|</math>, con <math>k</math> siendo la clave, <math>i</math> siendo el número de intento, y <math>|T|</math> siendo la longitud del arreglo de claves.
En el primer caso, la función de hash tendría colisiones siempre en el primer intento, ya que en ese caso, <math>h(k,0) = h_1(k) mod |T|</math>, y <math>h_1(k)</math> siempre devolvería el mismo valor.
Luego, si hay una colisión para <math> h(k, i) = c + i * h_2(k) </math>, siendo <math> h_1(k) = c </math>, se produciría aglomeración secundaria, ya que:
<math>\forall i,  h_1(k1) == h_1(k2) \implies h(k1,i) == h(k2,i) </math>.
En el segundo caso, ni bien haya una colisión en <math>h_1</math>, habrá una colisión en la función de hash total, ya que <math>h(k,i) = (h_1(k) + i * constante) mod |T|</math>. Esto produciría aglomeración primaria.
[[Category: Finales]]
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: