Quiero comenzar diciendo que esta NO es una pregunta de tarea. Estoy leyendo Introducción a los algoritmos, el famoso texto CLRS para ser un mejor programador. Estoy tratando de resolver los problemas y ejercicios dados en el libro por mí mismo.
Estoy tratando de resolver el Ejercicio 10.1-2 del Capítulo 10 Estructuras de datos elementales de la segunda edición de CLRS. Esto es lo que dice:
Explicar cómo implementar dos pilas en una matriz A [1..n] de tal manera que ninguna pila se desborde a menos que el número total de elementos en ambas pilas juntas sea n . Las operaciones PUSH y POP deben ejecutarse en tiempo O (1) .
La solución que se me ocurrió hasta ahora es:
Deje la matriz A [1..n] implemente dos pilas: S1 [1..i] y S2 [i..n] .
Para las operaciones PUSH-S1 y PUSH-S2 , si la pila está 'llena', entonces comience a insertar elementos en la otra pila (por ejemplo, si la pila S1 está llena cuando un nuevo elemento está tratando de ser empujado, luego empuje ese elemento hacia adentro pila S2 y viceversa).
El problema con este enfoque es que no podré POP-S1 o POP-S2 de manera confiable ya que no hay forma de 'recordar' qué elemento pertenece a qué pila. Si los elementos de la pila son pares (clave, valor) , siendo la clave el número de la pila, entonces para hacer estallar un elemento tendría que buscar, en el peor de los casos, i o (ni) veces, que será O (n ) (siéntase libre de corregirme si me equivoco aquí), que no sería O (1) .
He estado golpeando mi cabeza con la pregunta desde hace bastante tiempo. ¿Estoy en el camino correcto? ¿Alguien puede dar mis posibles consejos para resolver este problema?
En general, ¿cómo debo 'pensar' sobre estos problemas? ¿O solo las personas realmente inteligentes pueden resolver este tipo de problemas? ¿Abordar / resolver problemas como estos (es decir, adquirir experiencia) me ayudará a mejorar en esto?
Espero la iluminación.