X-Git-Url: https://git.llucax.com/z.facultad/75.29/susanita.git/blobdiff_plain/85126dc2ec08ec3d74bb0932630d1b6b58392f45..3cf8caf3c30d7790d1467466ecd556b399cbb301:/src/persona.cpp?ds=sidebyside diff --git a/src/persona.cpp b/src/persona.cpp index 607e0e8..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^2.log(N^2)) +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 - // Pero el PersonaCmp() es O(N) - 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