Tenemos una serie de N palabras, ¿cómo podríamos clasificarlas con O (N) complejidad de tiempo?

No estoy de acuerdo con otras respuestas. O (n.log (n)) es solo un límite estricto para las clasificaciones in situ y la clasificación de datos de entrada con propiedades de dispersión desconocidas.

Pero si las condiciones son correctas, puede usar, por ejemplo, la clasificación Radix (también conocida como clasificación postal por código postal) para clasificarlas con un costo muy cercano a O (n) .

Acabo de dar la idea (en realidad estoy describiendo la primera etapa de la ordenación relacionada pero más simple de Bucket sort). Imagine que cada palabra comienza con una letra diferente y tiene tantas palabras como letras en el alfabeto, solo leer la palabra una vez permitirá colocarla en el lugar correcto. Por supuesto, esta idea también funciona si tomamos las primeras dos o tres letras en lugar de solo la primera.

Si B es el número de cubos y tiene una buena dispersión de los datos de entrada, la complejidad del tipo se convierte en O (B + n log (n / B)) (esto se debe a que si varias palabras chocan en el mismo segmento, aún deben ser ordenado).

Para fines prácticos, la parte log (n / B) puede verse como una pequeña constante si sabemos que los datos tienen buenas propiedades de dispersión. Por supuesto, la complejidad ahora depende de la longitud promedio de los datos de entrada. Es muy eficiente para conjuntos de datos pequeños (incluso mejor si tiene muchas palabras de entrada idénticas), menos eficiente para palabras más largas.

¿Por qué ordenar por correo? Porque la idea es exactamente la que usan las oficinas de correos cuando clasifican por código postal.

Otra opción podría ser usar un algoritmo de ordenamiento paralelo. Al hacerlo, incluso puede obtener una complejidad de clasificación mejor que O (n) , generalmente O (n / p. Log (n)) donde p es el número de procesadores disponibles. Pero también se le debe advertir que dicho algoritmo también suele tener un alto costo constante y que la complejidad no lo es todo.

No puedes Si usa comparaciones, la ordenación lleva un tiempo proporcional a [math] n \ log n [/ math]. Si no utiliza las comparaciones, termina con un ordenamiento de cubeta de arriba hacia abajo, pero su complejidad temporal dependerá de la longitud del prefijo común de dos cadenas, y termina de nuevo con un tiempo proporcional a [matemática] n \ log n [/ math].

Así que simplemente usa una clasificación rápida. Es posible adaptar la clasificación rápida específicamente a las cadenas de modo que las comparaciones sean más rápidas (comparando caracteres individuales en lugar de la cadena completa), pero creo que eso es lo mejor que puede hacer.

No puede hacer eso en la complejidad N, pero el mínimo es nLogN (clasificación rápida)