X-Git-Url: https://git.llucax.com/z.facultad/75.29/susanita.git/blobdiff_plain/9d34215ecaec19da3d96f812c72f146c0e332a55..3cf8caf3c30d7790d1467466ecd556b399cbb301:/src/galeshapley.cpp diff --git a/src/galeshapley.cpp b/src/galeshapley.cpp index b2f2ac3..c71c650 100644 --- a/src/galeshapley.cpp +++ b/src/galeshapley.cpp @@ -14,8 +14,9 @@ GaleShapley(size_type capacidad): void GaleShapley:: -primera_ronda() // O(N^3.log(N^2)) +primera_ronda() // O(N^2.log(N)) { + cant_comprometidos = 0; for (personas_type::iterator ih = hombres.begin(); // O(N) ih != hombres.end(); ++ih) { @@ -27,18 +28,19 @@ primera_ronda() // O(N^3.log(N^2)) Persona& m = **im; if (m.ofertas.empty()) // O(1) continue; - m.ordenar_ofertas(); // O(N^2.log(N^2)) + m.ordenar_ofertas(); // O(N.log(N)) Persona& prometido = *(m.ofertas.front()); // O(1) m.ofertas.pop_front(); // O(1) 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) { @@ -61,7 +63,7 @@ nesima_ronda() // O(N^3.log(N^2)) h.declarar_a(*pm); // O(1) } - // Todo el for es O(N^3.log(N^2)) + // Todo el for es O(N^2.log(N)) for (personas_type::iterator im = mujeres.begin(); // O(N) im != mujeres.end(); ++im) { @@ -69,14 +71,16 @@ nesima_ronda() // O(N^3.log(N^2)) if (m.ofertas.empty()) // O(1) continue; - m.ordenar_ofertas(); // O(N^2.log(N^2)) + m.ordenar_ofertas(); // O(N.log(N)) Persona* ph = m.ofertas.front(); // O(1) m.ofertas.pop_front(); // O(1) 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 @@ -87,7 +91,7 @@ nesima_ronda() // O(N^3.log(N^2)) 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) @@ -96,29 +100,28 @@ nesima_ronda() // O(N^3.log(N^2)) 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^2) { - 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) + while (!todos_h_comprometidos()) // O(1) + nesima_ronda(); // O(N^2) }