Acomodar susanita.py para usar el mismo formato de salida que el de C++.
En este punto, el GS de C++ y el de Python dan exactamente lo mismo para los
casos de prueba mas grandes. Eeeeeeeeeeeeeee =)
Hacer que todos_h_comprometidos() sea O(1).
Usamos una variable propia del GS para contar la cantidad de hombres
comprometidos, y cuando esta alcanza a la capacidad, ya estamos.
Agregar una tabla de hash para las preferencias.
Ademas de la lista de preferencias, agregar una tabla hash que relacione el
nombre de la persona con el numero de preferencia, arrancando de 0.
Esto nos permite comparar en O(1) y asi bajar significativamente los ordenes
de varios algoritmos.
En un patch subsecuente se actualizaran los comentarios con los ordenes donde
corresponda.
Guarda resultados del BT para hacer la salida igual que el GS.
Este parche hace que el BT guarde los resultados (las parejas) cuando encuentra
una solución, así al hacer el unwind puede volver a recuperarlo y hacer la
salida consistente con la del GS.
Generalizar HashTable para almacenar void * como valores.
Esto elimina la restriccion de usar personas para la tabla hash. El motivo es
que vamos a querer usar hashes _dentro_ de la clase persona, y sino tenemos
una referencia circular molesta. Aparte en el futuro podemos querer usarla
para almacenar otras cosas.
Agrega y usa tabla hash.
Este parche agrega una tabla hash de hashing abierto _MUY_ simple, de tamaño
inmutable (elegido al construirla). Sólo se pueden obtener elementos del hash,
no eliminar (total la población de claves no cambia en todo el programa). En
fin, bien específica para este problema.
La implementación consiste en un vector donde cada elemento es una lista donde
cada elemento es una tupla (clave, valor). Si la lista está vacía, entonces esa
posición del hash está vacía, si tiene un elemento obtenerlo es O(1) y si tiene
más (colisión) es O(colision) (no está ordenada ni nada porque podemos
garantizar MUY fácil que casi no haya colisiones dandole una capacidad apropiada
a la tabla hash).
Como para construir la tabla de hash necesitamos saber la cardinalidad de la
población de antemano, hice un hack medio feo pero útil que lee la 1ra línea del
archivo y cuenta la cantidad de nombres en la lista de preferencias de la 1ra
persona, con eso basta para obtener el N del problema. La tabla de hash la crea
con capacidad N * 2 (así tiene un factor de ocupación de 50% como decían en la
práctica).
Por último, uso el hash para Susanita::nombres, cosa que no sé si es del todo
útil (se usa sólo en el parser, calculo que para que el algoritmo sea O(N^2)
deberíamos usar el hash en la resolución). Pero bueno, tenía que ponerlo en
algún lado para probarlo =)
Versión inicial portada desde python (no funciona).
Esta es la versión inicial portada desde python. Tiene algunos problemas y muere
en un loop infinito, pero para poder arreglarlo sincronizadamente optamos por
subirlo al repo en este estado.
En test/ están los ejemplos de prueba y el programa en python que anda.