Entrada: un entero positivo K y un texto grande. En realidad, el texto puede verse como una secuencia de palabras. Así que no tenemos que preocuparnos por cómo dividirlo en una secuencia de palabras.
Resultado: Las palabras K más frecuentes en el texto.
Mi pensamiento es así.
use una tabla hash para registrar la frecuencia de todas las palabras mientras recorre toda la secuencia de palabras. En esta fase, la clave es "palabra" y el valor es "frecuencia de palabra". Esto lleva O (n) tiempo.
ordenar el par (palabra, palabra-frecuencia); y la clave es "frecuencia de palabras". Esto lleva O (n * lg (n)) tiempo con el algoritmo de clasificación normal.
Después de clasificar, solo tomamos las primeras K palabras. Esto lleva tiempo O (K).
Para resumir, el tiempo total es O (n + n lg (n) + K) , Dado que K es seguramente más pequeño que N, en realidad es O (n lg (n)).
Podemos mejorar esto. En realidad, solo queremos las K palabras más importantes. La frecuencia de otras palabras no nos preocupa. Por lo tanto, podemos usar "clasificación de montón parcial". Para los pasos 2) y 3), no solo clasificamos. En cambio, lo cambiamos para que sea
2 ') construye un montón de pares (palabra, frecuencia de palabra) con "frecuencia de palabra" como clave. Se necesita O (n) tiempo para construir un montón;
3 ') extrae las primeras K palabras del montón. Cada extracción es O (lg (n)). Entonces, el tiempo total es O (k * lg (n)).
En resumen, esta solución costó tiempo O (n + k * lg (n)).
Este es solo mi pensamiento. No he encontrado la forma de mejorar el paso 1).
Espero que algunos expertos en recuperación de información puedan arrojar más luz sobre esta pregunta.