Una solución al problema top k.

Hay n números (n es generalmente muy grande), y ¿cómo encontrar los k números más grandes?

Idea:
Utilice el montón para realizar
1. Primero elija k números de n para construir un pequeño montón superior.
2. Luego, compare los nk restantes con los elementos superiores del montón.
3. Para cada comparación se realizarán diferentes tratamientos según el resultado de la comparación.
        1) Si el número es menor que el elemento superior del montón, entonces este número no debe estar en la parte superior k, y descartarlo directamente.
        2) Si el número es mayor que el elemento superior del montón, entonces este número puede estar en la parte superior k, y el elemento superior no debe estar en la parte superior k.Sustituya el elemento superior con este número y luego reajuste el montón.
        Si el número es el mismo que el del elemento superior del montón, se puede ejecutar 1) o 2) 1) Se puede evitar el ajuste del montón.
4. Una vez comparados todos los números, el elemento restante del montón es top k.

Complejidad del tiempo: al
crear un montón, se necesita logk para agregar un elemento. Al comparar, cada comparación toma logk. El número de elementos agregados durante la formación del equipo + el número de comparaciones = n. La complejidad del tiempo es O (n log k)
Complejidad del espacio:
tamaño del montón, O (k)

Implementación de C ++:

#include <queue>
#include <vector>
#include <cstdio>
using namespace std;

void topK(const vector<int> & input ,vector<int> & result, int k){
    
    

    priority_queue<int, vector<int>,greater<int>> pq;

    for(int i=0; i<k; i++)
        pq.push(input[i]);

    for(int i=k; i<input.size(); i++){
    
    
        if(input[i]<=pq.top())
            ;
        else if(input[i]>pq.top()){
    
    
            pq.pop();
            pq.push(input[i]);
        }
    }

    result.clear();
    for(int i=0; i<k; i++) {
    
    
        result.push_back(pq.top());
        pq.pop();
    }

}



int main() {
    
    
    vector<int> input;
    vector<int> result;
    int t,n,k;

    scanf("%d%d", &n, &k);

    while(scanf("%d", &t)==1)
        input.push_back(t);

    topK(input, result, k);

    for(auto it=result.begin(); it!=result.end(); it++)
        printf("%d ", *it);
    printf("\n");

    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/wx_assa/article/details/107878975
Recomendado
Clasificación