GaleShapley::
primera_ronda() // O(N^2.log(N))
{
+ cant_comprometidos = 0;
for (personas_type::iterator ih = hombres.begin(); // O(N)
ih != hombres.end(); ++ih)
{
Persona& prometido = *(m.ofertas.front()); // O(1)
m.ofertas.pop_front(); // O(1)
m.comprometer_con(prometido); // O(N)
+ cant_comprometidos++;
}
}
if (m.cmp(*(m.pareja), *ph) < 0) // O(1)
{
// la oferta es mejor, rompemos el compromiso
+ // No cambiamos la cantidad de comprometidos
+ // porque estamos cambiando uno por otro
m.comprometer_con(*ph); // O(N)
}
else
else
{
m.comprometer_con(*ph); // O(N)
+ cant_comprometidos++;
}
}
}
bool
GaleShapley::
-todos_h_comprometidos() const // O(N)
+todos_h_comprometidos() const // O(1)
{
- // FIXME: podemos ver de poner esto adentro de nesima_ronda()
- for (personas_type::const_iterator ih = hombres.begin(); // O(N)
- ih != hombres.end(); ++ih)
- if ((*ih)->estado != Persona::COMPROMETIDO)
- return false;
- return true;
+ if (cant_comprometidos == capacidad) {
+ return true;
+ }
+ return false;
}
void
GaleShapley::
-casamentear() // O(N^3.log(N))
+casamentear() // O(N^2.log(N))
{
primera_ronda(); // O(N^2.log(N))
- while (!todos_h_comprometidos()) // O(N)
+ while (!todos_h_comprometidos()) // O(1)
nesima_ronda(); // O(N^2.log(N))
}
{
/// Constructor
- GaleShapley();
+ GaleShapley(size_type capacidad);
/// Empieza a emparejar gente
void casamentear();
*/
void nesima_ronda();
+ // Cantidad de hombres comprometidos; se usa para optimizar
+ // todos_h_comprometidos().
+ unsigned int cant_comprometidos;
+
/// Se fija si todos los hombres estan comprometidos
bool todos_h_comprometidos() const;