¿Cuál es la complejidad temporal para ordenar n cadenas de n caracteres, cada una utilizando un orden lexicográfico?

Con respecto a la pregunta real, las cadenas [math] n [/ math] se pueden ordenar en [math] \ Theta (n ^ 2) [/ math] time. Por ejemplo, esto se puede hacer construyendo un trie y luego atravesándolo de izquierda a derecha. Esto es óptimo, ya que [math] \ Theta (n ^ 2) [/ math] ya es el tamaño de la entrada. Otra posibilidad es usar RadixSort, esto conduce a la misma complejidad de tiempo asintótica.

Los detalles de la pregunta actual mencionan la recurrencia [matemática] T (n) = 2T (n / 2) + O (n ^ 2) [/ matemática]. Es muy probable que esta recurrencia esté mal. En particular, esta recurrencia no describe el tiempo necesario para ordenar las cadenas [math] n [/ math] usando MergeSort.

¿Porqué es eso? Porque solo la cantidad de cadenas se reduce a medida que divide el problema recursivamente en subproblemas más pequeños. La longitud de esas cadenas sigue siendo la misma, y ​​también el tiempo (peor de los casos) necesario para comparar dos cadenas .

Un análisis correcto del uso de MergeSort para ordenar cadenas es realmente muy simple. Sabemos que MergeSort realiza [math] \ Theta (n \ log n) [/ math] comparaciones para ordenar objetos [math] n [/ math]. En nuestro caso, los objetos son cadenas de caracteres [matemáticas] n [/ matemáticas], por lo tanto, cada comparación lleva tiempo [matemáticas] O (n) [/ matemáticas]. Por lo tanto, todo el algoritmo se ejecuta en [matemáticas] O (n ^ 2 \ log n) [/ matemáticas]. En el peor de los casos, esta solución es peor que la que tiene el trie por un factor de [math] \ log n [/ math].

(Una nota técnica: las estimaciones de complejidad temporal para las soluciones [matemática] \ Theta (n ^ 2) [/ matemática] suponen en silencio que el tamaño del alfabeto es una constante).