/// 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
-bool
+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;
}
/// Ordenamos las ofertas segun nuestras preferencias
void
Persona::
-ordenar_ofertas() // O(N^2.log(N^2))
+ordenar_ofertas() // O(N.log(N))
{
// este sort es in-place y O(N.log(N))
// Más info en: http://www.sgi.com/tech/stl/sort.html
- // Pero el PersonaCmp() es O(N)
+ // PersonaCmp() es O(1), asi que el orden es el mismo.
std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this));
}