X-Git-Url: https://git.llucax.com/z.facultad/75.29/susanita.git/blobdiff_plain/bf62b54574e0957ccde11a1bf49889986051cff0..3cf8caf3c30d7790d1467466ecd556b399cbb301:/src/persona.cpp diff --git a/src/persona.cpp b/src/persona.cpp index 0016f3e..7cd2843 100644 --- a/src/persona.cpp +++ b/src/persona.cpp @@ -1,4 +1,5 @@ #include "persona.h" +#include "heap.h" #include #include @@ -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.log(N)) +push_oferta(Persona* p) // 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 - // PersonaCmp() es O(1), asi que el orden es el mismo. - std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this)); + 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)) +{ + 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