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.
susanita.add_persona(pp);
}
susanita.add_persona(pp);
}
- Persona::prefs_type prefs;
while (ss)
{
std::string nombre = get_hasta(ss, ',');
while (ss)
{
std::string nombre = get_hasta(ss, ',');
susanita.add_persona(ppp);
}
pp->prefs.push_back(ppp);
susanita.add_persona(ppp);
}
pp->prefs.push_back(ppp);
+ pp->prefs_hash[ppp->nombre] = count;
+ count++;
/// Constructor
Persona::
Persona(const std::string& nombre, sexo_type sexo, size_type cap):
/// Constructor
Persona::
Persona(const std::string& nombre, sexo_type sexo, size_type cap):
- nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0), rechazos(cap)
+ nombre(nombre), prefs_hash(cap), estado(SOLTERO), sexo(sexo),
+ pareja(0), rechazos(cap)
/// Función de comparación entre dos personas según nuestras preferencias
int
Persona::
/// Función de comparación entre dos personas según nuestras preferencias
int
Persona::
-cmp(const Persona& p1, const Persona& p2) const // O(N)
+cmp(const Persona& p1, const Persona& p2) const // O(1)
- prefs_type::const_iterator pos_p1
- = std::find(prefs.begin(), prefs.end(), &p1); // O(N)
- prefs_type::const_iterator pos_p2
- = std::find(prefs.begin(), prefs.end(), &p2); // O(N)
- if (pos_p1 < pos_p2)
+ int i1 = prefs_hash.get(p1.nombre); // O(1)
+ int i2 = prefs_hash.get(p2.nombre); // O(1)
+
+ if (i1 < i2)
/// Nombre de la persona, sólo con fines de representación
std::string nombre;
/// Nombre de la persona, sólo con fines de representación
std::string nombre;
- /// Lista de personas que prefiere, la primera de la lista es la
- /// que mejor posicionada esta
+ /// Para la lista de personas que prefiere usamos dos estructuras: la
+ /// primera es una lista en donde el primer elemento es la persona
+ /// mejor posicionada; la segunda es un hash indexado por el nombre de
+ /// la persona, y como valor la posicion numerica.
+ /// Esta dualidad nos permite tener iteracion en orden, O(1) en
+ /// encontrar el mejor, y O(1) en ver quien es el preferido entre dos
+ /// personas.
+ HashTable<int> prefs_hash;
/// Estado de la persona
estado_type estado;
/// Estado de la persona
estado_type estado;