Convierte informe a RTF sin comprimir.
No sé si estaba comprimido o en algún formato binario raro, pero al estar en
"ASCII" el RTF es mucho más amistoso con el darcs y hasta incluso puede
sobrevivir a un merge.
Agrega script para correr pruebas.
Este parche agrega un script para correr pruebas fácilmente.
Uso: ./corridas.sh gs|bt [series] [hasta]
Ejecuta 'series' veces una tanda de pruebas que consiste en resolver archivos
generados aleatoriamente con 1 a 'hasta' parejas (N).
Cambia formato del comando ejecutable.
Este parche hace que sea obligatorio especificar el algoritmo a usar y agrega
una opción para ejecutarlo silencioso (sólo devolviendo el tiempo que tardó)
para hacer pruebas más rápido. Nueva forma de uso:
./tdatp2 gs|bt archivo [-q]
Agrega cuanto tardó a la salida.
Esto lo hacía en algún momento, parece que alguien lo había pisado. Ahora la
salida es un poco más linda (aunque menos parser-friendly, pero nada grave).
Siempre el tiempo se escupe por stderr.
Usa heap para las ofertas.
Este parche agrega 2 funciones básicas para manejo de heap (push y pop), basado
en las de la STL (pero son legibles =).
Con esto el GS está en el aclamado O(N^2)!
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.