X-Git-Url: https://git.llucax.com/z.facultad/75.29/susanita.git/blobdiff_plain/9d34215ecaec19da3d96f812c72f146c0e332a55..3cf8caf3c30d7790d1467466ecd556b399cbb301:/src/persona.cpp diff --git a/src/persona.cpp b/src/persona.cpp index a8726ab..7cd2843 100644 --- a/src/persona.cpp +++ b/src/persona.cpp @@ -1,11 +1,13 @@ #include "persona.h" +#include "heap.h" #include #include /// Constructor Persona:: Persona(const std::string& nombre, sexo_type sexo, size_type cap): - nombre(nombre), estado(SOLTERO), sexo(sexo), pareja(0), rechazos(cap) + nombre(nombre), prefs_hash(cap), estado(SOLTERO), sexo(sexo), + pareja(0), rechazos(cap) { } @@ -58,17 +60,16 @@ operator<< (std::ostream& os, const Persona& p) } /// Función de comparación entre dos personas según nuestras preferencias -bool +int Persona:: -cmp(const Persona& p1, const Persona& p2) const // O(N) +cmp(const Persona& p1, const Persona& p2) const // O(1) { - prefs_type::const_iterator pos_p1 - = std::find(prefs.begin(), prefs.end(), &p1); // O(N) - prefs_type::const_iterator pos_p2 - = std::find(prefs.begin(), prefs.end(), &p2); // O(N) - if (pos_p1 < pos_p2) + int i1 = prefs_hash.get(p1.nombre); // O(1) + int i2 = prefs_hash.get(p2.nombre); // O(1) + + if (i1 < i2) return 1; - if (pos_p1 == pos_p2) + if (i1 == i2) return 0; return -1; } @@ -79,35 +80,48 @@ namespace /// Functor de ordenamiento auxiliar struct PersonaCmp { - Persona& p; + const Persona& p; PersonaCmp(Persona& p): p(p) {} /// devuelve true si p1 < p2 - bool operator ()(const Persona* const p1, const Persona* const p2) + bool operator ()(const Persona* const p1, const Persona* const p2) const { - return p.cmp(*p1, *p2) < 0; // O(N) + return p.cmp(*p1, *p2) > 0; // O(1) } }; } -/// Ordenamos las ofertas segun nuestras preferencias +/// Inserta nueva oferta void Persona:: -ordenar_ofertas() // O(N^2.log(N^2)) +push_oferta(Persona* p) // O(log(N)) +{ + heap_push(ofertas, p, PersonaCmp(*this)); +} + +/// Obtiene mejor oferta (sin eliminar) +Persona* +Persona:: +top_oferta() const // O(1) +{ + return ofertas.back(); +} + +/// Obtiene y elimina mejor oferta +Persona* +Persona:: +pop_oferta() // O(log(N)) { - // este sort es in-place y O(N.log(N)) - // Más info en: http://www.sgi.com/tech/stl/sort.html - // Pero el PersonaCmp() es O(N) - std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this)); + return heap_pop(ofertas, PersonaCmp(*this)); } /// Nos declaramos a la persona p void Persona:: -declarar_a(Persona& p) // O(1) +declarar_a(Persona& p) // O(log(N)) { estado = DECLARADO; pareja = &p; - p.ofertas.push_back(this); // O(1) + p.push_oferta(this); // O(log(N)) } /// Nos comprometemos con la persona p, quien se nos habia declarado previamente