Se pueden implementar de manera eficiente dos pilas usando una matriz de tamaño fijo: la pila # 1 comienza desde el extremo izquierdo y crece hacia la derecha, y la pila # 2 comienza desde el extremo derecho y crece hacia la izquierda. ¿Es lo mismo posible para tres pilas?
Más específicamente, es posible implementar tres pilas dadas las siguientes condiciones:
- Tiene una matriz de tamaño fijo que puede contener N objetos.
- Mientras la suma de los tres tamaños de pila sea <N, push () no debería fallar.
- Ambas operaciones push () y pop () deberían tomar tiempo O (1).
- Además de la matriz, puede usar solo O (1) espacio adicional.
Aquí hay ejemplos de soluciones que no satisfacen estos requisitos:
- Dividir la matriz en 3 partes fijas y usar cada parte para una pila (viola 2).
- Similar a lo anterior pero con límites móviles entre las pilas (viola 3).
- Implementaciones simples basadas en listas vinculadas (viola 4).
Aceptaré algoritmos no triviales o pruebas de imposibilidad incluso si no cumplen con todas las condiciones (1) - (4) exactamente, por ejemplo, un algoritmo donde push / pop toma O (1) tiempo amortizado, o donde el la memoria adicional es menor que O (N), por ejemplo, O (log N). O una prueba de imposibilidad que muestra que, por ejemplo, es imposible acceder a menos de 5 elementos de la matriz por push / pop.
fuente
Respuestas:
fuente
Deje que N sea la longitud de la matriz subyacente. Puedo imaginar pilas como listas enlazadas de fragmentos grandes, de modo que el número total de fragmentos no sea más que O (log2 (N)). Coloque la tercera pila entre las dos primeras, en el índice de N / 2. Entonces tenemos 3 áreas ocupadas y 2 libres. Cuando una pila no puede aceptar el siguiente elemento, esto significa que un área libre está agotada. Si el otro también está agotado, entonces toda la memoria está agotada. De lo contrario, hay otra área libre con un tamaño no mayor a N / 2. Continúa la pila desbordada en esa área libre. para que toda la configuración se parezca al diseño inicial de las pilas. Como la memoria libre ahora no es más que la mitad de la inicial, no habrá más que log2 (N) de tales operaciones de enlace. Cada operación de enlace requiere una cantidad fija de memoria para guardar el estado anterior de la pila. Entonces,
fuente