Esta pregunta está inspirada en una pregunta existente sobre si una pila se puede simular usando dos colas en el tiempo amortizado por operación de pila. La respuesta parece ser desconocida. Aquí hay una pregunta más específica, correspondiente al caso especial en el que todas las operaciones PUSH se realizan primero, seguidas de todas las operaciones POP. ¿Cuán eficientemente se puede revertir una lista de elementos usando dos colas inicialmente vacías? Las operaciones legales son:N
- Poner en cola el siguiente elemento de la lista de entrada (al final de cualquiera de las colas).
- Elimine el elemento en la cabecera de cualquiera de las colas y vuelva a colocarlo en cola (hasta la cola de cualquiera de las colas).
- Elimine el elemento en la cabecera de cualquiera de las colas y agréguelo a la lista de salida.
Si la lista de entrada consta de elementos , ¿cómo funciona el número mínimo de operaciones necesarias para generar la lista de salida invertida comportarse? Una prueba de que crece más rápido que O (N) sería especialmente interesante, ya que resolvería la pregunta original en forma negativa.[ N , N - 1 , . . . , 2 , 1 ] O ( N )
Actualización (15 de enero de 2011): el problema se puede resolver en , como se muestra en las respuestas enviadas y sus comentarios; y un límite inferior de es trivial. ¿Se puede mejorar cualquiera de estos límites?
Respuestas:
Si N es una potencia de dos, creo que las operaciones O (N log N) son suficientes, incluso para un problema algo más restringido en el que todos los elementos comienzan en una de las colas y deben terminar en orden inverso en una de las colas (sin las listas de entrada y salida).
En los pasos O (N) es posible comenzar con todos los elementos en una cola, jugar "uno para usted uno para mí" para dividirlos en subconjuntos alternos en la otra cola, y luego concatenarlos de nuevo en una cola. En términos de las representaciones binarias de las posiciones de los elementos, esto implementa una operación de rotación.
En los pasos O (N) también es posible extraer pares de elementos de una cola, intercambiarlos y luego volverlos a colocar, invirtiendo todos los pares. En términos de las representaciones binarias de las posiciones de los elementos, esto complementa el bit de orden inferior de la posición.
Al repetir O (log N) multiplicado por un cambio aleatorio y un intercambio por pares, podemos complementar todos los bits de las representaciones binarias de las posiciones, que es lo mismo que invertir la lista.
fuente
El mejor algoritmo que se me ocurre requiere transferencias de una cola a otra.∑N/2−1i=0(N−2i−2)
Permite nombrar dos colas disponibles como izquierda y derecha. Aquí está la idea básica de este algoritmo con la suposición de que N es par:
Es fácil ver cómo el algoritmo debería funcionar para N. impar
fuente