Entrada: Um número inteiro positivo K e um texto grande. O texto pode realmente ser visto como uma sequência de palavras. Portanto, não precisamos nos preocupar em como quebrá-lo na sequência de palavras.
Saída: as K palavras mais frequentes no texto.
Meu pensamento é assim.
use uma tabela de hash para registrar a frequência de todas as palavras enquanto percorre toda a sequência de palavras. Nesta fase, a chave é "palavra" e o valor é "frequência de palavras". Isso leva tempo O (n).
classifique o par (palavra, palavra-frequência); e a chave é "frequência de palavras". Isso leva tempo O (n * lg (n)) com o algoritmo de classificação normal.
Após a classificação, apenas pegamos as primeiras K palavras. Isso leva tempo O (K).
Para resumir, o tempo total é O (n + n lg (n) + K) , Uma vez que K é certamente menor que N, então é na verdade O (n lg (n)).
Podemos melhorar isso. Na verdade, queremos apenas as K palavras principais. A frequência de outras palavras não nos preocupa. Portanto, podemos usar "classificação Heap parcial". Para as etapas 2) e 3), não fazemos apenas a classificação. Em vez disso, mudamos para ser
2 ') construir um monte de pares de (palavra, palavra-frequência) com "palavra-frequência" como chave. Leva tempo O (n) para construir um heap;
3 ') extraia as K principais palavras da pilha. Cada extração é O (lg (n)). Portanto, o tempo total é O (k * lg (n)).
Para resumir, essa solução custa tempo O (n + k * lg (n)).
Este é apenas o meu pensamento. Não descobri uma maneira de melhorar a etapa 1).
Espero que alguns especialistas em Recuperação de Informações possam esclarecer melhor essa questão.