X-Git-Url: https://git.llucax.com/z.facultad/75.29/susanita.git/blobdiff_plain/9d34215ecaec19da3d96f812c72f146c0e332a55..48e5fe7766ed449568d5e5949c0621d5ffe5897b:/src/persona.cpp?ds=inline

diff --git a/src/persona.cpp b/src/persona.cpp
index a8726ab..0016f3e 100644
--- a/src/persona.cpp
+++ b/src/persona.cpp
@@ -5,7 +5,8 @@
 /// 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 +59,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;
 }
@@ -92,11 +92,11 @@ namespace
 /// Ordenamos las ofertas segun nuestras preferencias
 void
 Persona::
-ordenar_ofertas() // O(N^2.log(N^2))
+ordenar_ofertas() // O(N.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)
+	// PersonaCmp() es O(1), asi que el orden es el mismo.
 	std::sort(ofertas.begin(), ofertas.end(), PersonaCmp(*this));
 }