1 #include "galeshapley.h"
10 GaleShapley(size_type capacidad):
17 primera_ronda() // O(N^2.log(N))
19 cant_comprometidos = 0;
20 for (personas_type::iterator ih = hombres.begin(); // O(N)
21 ih != hombres.end(); ++ih)
23 (*ih)->declarar_a(*((*ih)->prefs.front())); // O(1)
25 for (personas_type::iterator im = mujeres.begin(); // O(N)
26 im != mujeres.end(); ++im)
29 if (m.ofertas.empty()) // O(1)
31 m.ordenar_ofertas(); // O(N.log(N))
32 Persona& prometido = *(m.ofertas.front()); // O(1)
33 m.ofertas.pop_front(); // O(1)
34 m.comprometer_con(prometido); // O(N)
41 nesima_ronda() // O(N^2)
43 // Todo el for es O(N^2)
44 for (personas_type::iterator ih = hombres.begin(); // O(N)
45 ih != hombres.end(); ++ih)
48 if (h.estado == Persona::COMPROMETIDO)
52 for (personas_type::iterator im = h.prefs.begin(); // O(N)
53 im != h.prefs.end(); ++im)
57 if (h.rechazos[pm->nombre] != NULL) // O(1)
62 assert(h.rechazos[pm->nombre] == NULL);
63 h.declarar_a(*pm); // O(1)
66 // Todo el for es O(N^2.log(N))
67 for (personas_type::iterator im = mujeres.begin(); // O(N)
68 im != mujeres.end(); ++im)
71 if (m.ofertas.empty()) // O(1)
74 m.ordenar_ofertas(); // O(N.log(N))
75 Persona* ph = m.ofertas.front(); // O(1)
76 m.ofertas.pop_front(); // O(1)
77 if (m.estado == Persona::COMPROMETIDO)
79 if (m.cmp(*(m.pareja), *ph) < 0) // O(1)
81 // la oferta es mejor, rompemos el compromiso
82 // No cambiamos la cantidad de comprometidos
83 // porque estamos cambiando uno por otro
84 m.comprometer_con(*ph); // O(N)
88 // estamos mejor con nuestra pareja actual, asi
89 // que no hacemos mas que rechazar a todos
90 // (incluyendo el mejor candidato)
91 for (Persona::ofertas_type::iterator i // O(N)
93 i != m.ofertas.end(); ++i)
94 (*i)->rechazos[(&m)->nombre] = &m;//O(1)
96 ph->rechazos[(&m)->nombre] = &m;
97 m.ofertas.clear(); // O(N)
102 m.comprometer_con(*ph); // O(N)
103 cant_comprometidos++;
110 todos_h_comprometidos() const // O(1)
112 if (cant_comprometidos == capacidad) {
121 casamentear() // O(N^2)
123 primera_ronda(); // O(N^2)
124 while (!todos_h_comprometidos()) // O(1)
125 nesima_ronda(); // O(N^2)