/// Constructor
Persona::
-Persona(const std::string& nombre, sexo_type sexo):
- nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0)
+Persona(const std::string& nombre, sexo_type sexo, size_type cap):
+ nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0), rechazos(cap)
{
}
/// Función de comparación entre dos personas según nuestras preferencias
bool
Persona::
-cmp(const Persona& p1, const Persona& p2) const
+cmp(const Persona& p1, const Persona& p2) const // O(N)
{
prefs_type::const_iterator pos_p1
- = std::find(prefs.begin(), prefs.end(), &p1);
+ = std::find(prefs.begin(), prefs.end(), &p1); // O(N)
prefs_type::const_iterator pos_p2
- = std::find(prefs.begin(), prefs.end(), &p2);
+ = std::find(prefs.begin(), prefs.end(), &p2); // O(N)
if (pos_p1 < pos_p2)
return 1;
if (pos_p1 == pos_p2)
/// devuelve true si p1 < p2
bool operator ()(const Persona* const p1, const Persona* const p2)
{
- return p.cmp(*p1, *p2) < 0;
+ return p.cmp(*p1, *p2) < 0; // O(N)
}
};
}
/// Ordenamos las ofertas segun nuestras preferencias
void
Persona::
-ordenar_ofertas()
+ordenar_ofertas() // O(N^2.log(N^2))
{
// 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)
std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this));
}
/// Nos declaramos a la persona p
void
Persona::
-declarar_a(Persona& p)
+declarar_a(Persona& p) // O(1)
{
estado = DECLARADO;
pareja = &p;
- p.ofertas.push_back(this);
+ p.ofertas.push_back(this); // O(1)
}
/// Nos comprometemos con la persona p, quien se nos habia declarado previamente
void
Persona::
-comprometer_con(Persona& p)
+comprometer_con(Persona& p) // O(N) ( es O(len(ofertas)) )
{
assert(p.estado == DECLARADO);
assert(p.pareja == this);
assert(pareja != 0);
pareja->estado = SOLTERO;
pareja->pareja = 0;
- pareja->rechazos.push_back(this);
+ pareja->rechazos[this->nombre] = this; // O(1)
}
// nos comprometemos
p.pareja = this;
// si tenemos ofertas, las rechazamos
- for (ofertas_type::iterator pretendiente = ofertas.begin();
+ for (ofertas_type::iterator pretendiente = ofertas.begin(); // O(N)
pretendiente != ofertas.end(); ++pretendiente)
{
- (*pretendiente)->rechazos.push_back(this);
+ (*pretendiente)->rechazos[this->nombre] = this; // O(1)
}
- ofertas.clear();
+ ofertas.clear(); // O(N)
}
// Nos comprometemos con la otra persona y a ella la comprometemos con nosotros