¿Cuál es el mejor método para ordenando una pila en orden ascendente? I se encontró con esta pregunta de la entrevista y me encontré con algunos problemas para encontrar la mejor y más eficiente solución.Ordenando una pila en orden ascendente?
Hay dos métodos que se me ocurren.
hacer estallar todos los contenidos de la pila y almacenarlos en una matriz, y luego ordenar la matriz en
O(nLog n)
y luego empujar el contenido copia de la pila. No es la mejor manera ....Haz la aplicación recursiva de la pila para la clasificación que
void sort(stack)
{
type x;
if (!isEmpty(stack)) {
x = pop(stack);
sort(stack);
insert(x, stack);
}
}
void insert(x, stack)
{
type y;
if (!isEmpty(stack) && top(stack) < x) {
y = pop(stack);
insert(x, stack);
push(y, stack);
}
else {
push(x, stack);
}
}
Pero el segundo método parece estar haciendo demasiadas llamadas recursivas y la sobrecarga será un problema si la pila pasa a ser realmente grande.
¿Es posible resolver este problema de una manera mucho mejor para la mejor complejidad de espacio y tiempo?
Hay tantas llamadas recursivas, (subproblemas superpuestos), ¿esto es un contendiente para el tipo de problemas dynamic programming
?
¿Cuál sería la mejor manera de resolver esto? ?
¿Por qué el tiempo de clasificación 'O (n * log n)' es subóptimo? Para el caso general, ese es el límite comprobado. –
No se puede hacer mejor que 'O (n)' espacio y 'O (n log n)' tiempo. Hacer estallar en una matriz, clasificar y empujar es óptimo. – avakar
@avakar: ¿Tiene una prueba para el primer reclamo ("no se puede hacer mejor que' O (n) 'espacio")? – NPE