susanita.add_persona(pp);
}
- Persona::prefs_type prefs;
+ int count = 0;
while (ss)
{
std::string nombre = get_hasta(ss, ',');
susanita.add_persona(ppp);
}
pp->prefs.push_back(ppp);
+ pp->prefs_hash[ppp->nombre] = count;
+ count++;
}
}
return true;
/// 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::
-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)
return 1;
- if (pos_p1 == pos_p2)
+ if (i1 == i2)
return 0;
return -1;
}
/// 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.
prefs_type prefs;
+ HashTable<int> prefs_hash;
/// Estado de la persona
estado_type estado;