Conjunto múltiple para el tipo de datos definido por el usuario

Se le dan Q consultas. Cada consulta contiene un número entero k y la información de una persona, es decir, nombre, apellido, edad. Para cada consulta, necesitamos generar la K-ésima persona entre ellas si toda la información de la persona está organizada en orden ascendente.
Nota: La persona A viene antes que la persona B si el primer nombre de A es lexicográfico más pequeño que el de B. Pero si el primer nombre es el mismo, entonces comparamos el apellido y también si el apellido también es el mismo, entonces tenemos que comparar sus edades .

Dado: K siempre será menor o igual al número de personas presentes.
Ejemplos:

Input : Q = 2
        1
        aa bb 10
        2 
        bb cc 10
Output :
First name:aa
Last name:bb
Age: 10

First name:bb
Last name:cc
Age: 10

Enfoque: Se sigue el siguiente algoritmo para resolver el problema anterior.

  • Básicamente, se nos proporciona el detalle de una persona con cada consulta y tenemos que decirle a la K-ésima persona si están ordenadas en orden ascendente.
  • Enfoque básico: después de cada consulta, ordenamos nuestra lista y simplemente imprimimos los detalles de la k-ésima persona. Pero si resolvemos el problema anterior usando la ordenación, entonces la complejidad del tiempo será O(q*q*log(q)). es decir, O(qlog(q)) para ordenar cada vez y q consultas.
  • Optimizado: podemos mejorar la complejidad del tiempo para el problema mencionado anteriormente. Como sabemos, la inserción en multiset se puede realizar en log(n).
  • Por lo tanto, solo haga un conjunto múltiple que se pueda usar para almacenar la estructura, y luego, después de cada consulta, simplemente inserte los detalles de la persona en nuestro conjunto múltiple.
  • Entonces, este parece ser un mejor enfoque. Nuestra complejidad general será O (q * log (q)).
// CPP program for queries to find k-th person where
// people are considered in lexicographic order of
// first name, then last name, then age
#include <bits/stdc++.h>
using namespace std;
  
struct person {
    string firstName, lastName;
    int age;
};
  
// operator overloading to use multiset for user 
// define data type.
bool operator<(person a, person b)
{
    if (a.firstName < b.firstName)
        return true;
    else if (a.firstName == b.firstName) {
        if (a.lastName < b.lastName)
            return true;
        else if (a.lastName == b.lastName) {
            if (a.age < b.age)
                return true;
            else
                return false;
        }
        else
            return false;
    }
    else
        return false;
}
  
// define function for printing our output
void print(multiset<person>::iterator it)
{
    cout << "First name:" << it->firstName << endl;
    cout << "Last name:" << it->lastName << endl;
    cout << "Age: " << it->age << endl;
}
  
int main()
{
    int q = 2;
  
    // define set for structure
    multiset<person> s;
  
    // declaration of person structure
    person p;
  
    // 1st Query k=1, first-name=aa, last-name=bb, age=10;
    int k = 1;
    p.firstName = "aa";
    p.lastName = "bb";
    p.age = 10;
  
    // now insert this structure in our set.
    s.insert(p);
  
    // now find Kth smallest element in set.
    multiset<person>::iterator it;
    it = s.begin();
  
    // find kth element by increment iterator by k
    std::advance(it, k - 1);
    print(it);
  
    // 2nd Query k=2, first-name=bb, last-name=cc, age=10;
    k = 2;
    p.firstName = "bb";
    p.lastName = "cc";
    p.age = 10;
  
    // now insert this structure in our set.
    s.insert(p);
  
    // now find Kth smallest element in set.
    it = s.begin();
  
    // find kth element by increment iterator by k
    std::advance(it, k - 1);
    print(it);
    return 0;
}
Producción:

First name:aa
Last name:bb
Age: 10
First name:bb
Last name:cc
Age: 10

Publicación traducida automáticamente

Artículo escrito por sahilshelangia y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *