Input: un intero positivo K e un testo grande. Il testo può effettivamente essere visualizzato come sequenza di parole. Quindi non dobbiamo preoccuparci di come scomporlo in sequenza di parole.
Risultato: le K parole più frequenti nel testo.
Il mio pensiero è così.
usa una tabella hash per registrare la frequenza di tutte le parole mentre attraversi l'intera sequenza di parole. In questa fase la chiave è "word" e il valore è "word-frequency". Questo richiede O (n) tempo.
ordinare la coppia (parola, parola-frequenza); e la chiave è "parola-frequenza". Questo richiede tempo O (n * lg (n)) con il normale algoritmo di ordinamento.
Dopo l'ordinamento, prendiamo solo le prime K parole. Questo richiede tempo O (K).
Per riassumere, il tempo totale è O (n + n lg (n) + K) , Poiché K è sicuramente più piccolo di N, quindi è effettivamente O (n lg (n)).
Possiamo migliorare questo. In realtà, vogliamo solo le prime K parole. La frequenza di altre parole non ci interessa. Quindi, possiamo usare "l'ordinamento parziale di Heap". Per i passaggi 2) e 3), non ci limitiamo a ordinare. Invece, lo cambiamo per essere
2 ') crea un mucchio di coppie (parola, parola-frequenza) con "parola-frequenza" come chiave. Ci vuole O (n) tempo per costruire un mucchio;
3 ') estrae le prime K parole dall'heap. Ogni estrazione è O (lg (n)). Quindi, il tempo totale è O (k * lg (n)).
Per riassumere, questa soluzione è costata tempo O (n + k * lg (n)).
Questo è solo il mio pensiero. Non ho trovato il modo per migliorare il passaggio 1).
Spero che alcuni esperti di recupero delle informazioni possano far luce su questa domanda.