Eingabe: Eine positive ganze Zahl K und ein großer Text. Der Text kann tatsächlich als Wortfolge angesehen werden. Wir müssen uns also keine Gedanken darüber machen, wie wir es in Wortfolgen aufteilen können.
Ausgabe: Die häufigsten K Wörter im Text.
Mein Denken ist so.
Verwenden Sie eine Hash-Tabelle, um die Häufigkeit aller Wörter aufzuzeichnen, während Sie die gesamte Wortfolge durchlaufen. In dieser Phase ist der Schlüssel "Wort" und der Wert ist "Wortfrequenz". Dies dauert O (n) Zeit.
sortiere das (Wort, Wort-Frequenz) Paar; und der Schlüssel ist "Worthäufigkeit". Dies dauert bei normalem Sortieralgorithmus O (n * lg (n)).
Nach dem Sortieren nehmen wir nur die ersten K Wörter. Dies dauert O (K) Zeit.
Zusammenfassend ist die Gesamtzeit O (n + n lg (n) + K) , Da K sicherlich kleiner als N ist, ist es tatsächlich O (n lg (n)).
Wir können das verbessern. Eigentlich wollen wir nur Top-K-Wörter. Mit anderen Worten, die Häufigkeit ist für uns nicht von Belang. Wir können also "partielle Heap-Sortierung" verwenden. In Schritt 2) und 3) sortieren wir nicht nur. Stattdessen ändern wir es so
2 ') einen Haufen von (Wort-, Wortfrequenz-) Paaren mit "Wortfrequenz" als Schlüssel aufbauen. Es dauert O (n) Zeit, um einen Heap zu erstellen;
3 ') extrahiere die obersten K Wörter aus dem Haufen. Jede Extraktion ist O (lg (n)). Die Gesamtzeit beträgt also O (k * lg (n)).
Zusammenfassend kostet diese Lösung Zeit O (n + k * lg (n)).
Das ist nur mein Gedanke. Ich habe keinen Weg gefunden, um Schritt 1) zu verbessern.
Ich hoffe, dass einige Experten für Information Retrieval mehr Licht in diese Frage bringen können.