void
GaleShapley::
-primera_ronda() // O(N^3.log(N^2))
+primera_ronda() // O(N^2)
{
+ cant_comprometidos = 0;
for (personas_type::iterator ih = hombres.begin(); // O(N)
ih != hombres.end(); ++ih)
{
(*ih)->declarar_a(*((*ih)->prefs.front())); // O(1)
}
+
+ // En total es O(N)*(O(N) + O(log(N))) = O(N^2)
for (personas_type::iterator im = mujeres.begin(); // O(N)
im != mujeres.end(); ++im)
{
Persona& m = **im;
if (m.ofertas.empty()) // O(1)
continue;
- m.ordenar_ofertas(); // O(N^2.log(N^2))
- Persona& prometido = *(m.ofertas.front()); // O(1)
- m.ofertas.pop_front(); // O(1)
- m.comprometer_con(prometido); // O(N)
+ Persona* prometido = m.pop_oferta(); // O(log(N))
+ m.comprometer_con(*prometido); // O(N)
+ cant_comprometidos++;
}
}
void
GaleShapley::
-nesima_ronda() // O(N^3.log(N^2))
+nesima_ronda() // O(N^2)
{
- // Todo el for es O(N^3)
+ // Todo el for es O(N^2)
for (personas_type::iterator ih = hombres.begin(); // O(N)
ih != hombres.end(); ++ih)
{
h.declarar_a(*pm); // O(1)
}
- // Todo el for es O(N^3.log(N^2))
+ // Todo el for es O(N^2)
for (personas_type::iterator im = mujeres.begin(); // O(N)
im != mujeres.end(); ++im)
{
if (m.ofertas.empty()) // O(1)
continue;
- m.ordenar_ofertas(); // O(N^2.log(N^2))
- Persona* ph = m.ofertas.front(); // O(1)
- m.ofertas.pop_front(); // O(1)
+ Persona* ph = m.pop_oferta(); // O(log(N))
if (m.estado == Persona::COMPROMETIDO)
{
- if (m.cmp(*(m.pareja), *ph) < 0) // O(N)
+ 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
for (Persona::ofertas_type::iterator i // O(N)
= m.ofertas.begin();
i != m.ofertas.end(); ++i)
- (*i)->rechazos[(&m)->nombre] = &m;
+ (*i)->rechazos[(&m)->nombre] = &m;//O(1)
ph->rechazos[(&m)->nombre] = &m;
m.ofertas.clear(); // O(N)
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^4.log(N^2))
+casamentear() // O(N^4)
{
- primera_ronda(); // O(N^3.log(N^2))
- while (!todos_h_comprometidos()) // O(N)
- nesima_ronda(); // O(N^3.log(N^2))
+ primera_ronda(); // O(N^2)
+
+ // El bucle podría correrse (haciendo una estimación bruta y
+ // poco realista) N*N veces, así que sería en total O(N^4)
+ while (!todos_h_comprometidos()) // O(1)
+ nesima_ronda(); // O(N^2)
}