1 #include "galeshapley.h"
10 GaleShapley(size_type capacidad):
17 primera_ronda() // O(N^2)
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)
26 // En total es O(N)*(O(N) + O(log(N))) = O(N^2)
27 for (personas_type::iterator im = mujeres.begin(); // O(N)
28 im != mujeres.end(); ++im)
31 if (m.ofertas.empty()) // O(1)
33 Persona* prometido = m.pop_oferta(); // O(log(N))
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)
67 for (personas_type::iterator im = mujeres.begin(); // O(N)
68 im != mujeres.end(); ++im)
71 if (m.ofertas.empty()) // O(1)
74 Persona* ph = m.pop_oferta(); // O(log(N))
75 if (m.estado == Persona::COMPROMETIDO)
77 if (m.cmp(*(m.pareja), *ph) < 0) // O(1)
79 // la oferta es mejor, rompemos el compromiso
80 // No cambiamos la cantidad de comprometidos
81 // porque estamos cambiando uno por otro
82 m.comprometer_con(*ph); // O(N)
86 // estamos mejor con nuestra pareja actual, asi
87 // que no hacemos mas que rechazar a todos
88 // (incluyendo el mejor candidato)
89 for (Persona::ofertas_type::iterator i // O(N)
91 i != m.ofertas.end(); ++i)
92 (*i)->rechazos[(&m)->nombre] = &m;//O(1)
94 ph->rechazos[(&m)->nombre] = &m;
95 m.ofertas.clear(); // O(N)
100 m.comprometer_con(*ph); // O(N)
101 cant_comprometidos++;
108 todos_h_comprometidos() const // O(1)
110 if (cant_comprometidos == capacidad) {
119 casamentear() // O(N^4)
121 primera_ronda(); // O(N^2)
123 // El bucle podría correrse (haciendo una estimación bruta y
124 // poco realista) N*N veces, así que sería en total O(N^4)
125 while (!todos_h_comprometidos()) // O(1)
126 nesima_ronda(); // O(N^2)