Essa pergunta é inspirada em uma pergunta existente sobre se uma pilha pode ser simulada usando duas filas no tempo amortizado por operação da pilha. A resposta parece ser desconhecida. Aqui está uma pergunta mais específica, correspondente ao caso especial em que todas as operações PUSH são executadas primeiro, seguidas por todas as operações POP. Com que eficiência uma lista de elementos pode ser revertida usando duas filas inicialmente vazias? As operações legais são:N
- Enfileire o próximo elemento da lista de entrada (até o final de qualquer fila).
- Enfileire o elemento na cabeça de qualquer fila e enfileire-o novamente (na cauda de qualquer fila).
- Retire da fila o elemento no início de qualquer fila e adicione-o à lista de saída.
Se a lista de entrada consistir em elementos , como o número mínimo de operações necessárias para gerar a lista de saída reversa se comportar? Uma prova de que cresce mais rápido que seria especialmente interessante, pois resolveria a questão original de forma negativa.[ N , N - 1 , . . . , 2 , 1 ] O ( N )
Atualização (15 de janeiro de 2011): O problema pode ser resolvido em , conforme mostrado nas respostas enviadas e em seus comentários; e um limite inferior de é trivial. Qualquer um desses limites pode ser aprimorado?Ω ( N )
Respostas:
Se N for uma potência de dois, acredito que as operações O (N log N) são suficientes, mesmo para um problema um pouco mais restrito, no qual todos os itens iniciam em uma das filas e devem terminar na ordem inversa em uma das filas (sem as listas de entrada e saída).
Nas etapas O (N), é possível começar com todos os elementos em uma fila, tocar "um para você um para mim" para dividi-los em subconjuntos alternados na outra fila e concatená-los novamente em uma fila. Em termos das representações binárias das posições dos itens, isso implementa uma operação de rotação.
Nas etapas O (N), também é possível extrair pares de elementos de uma fila, trocá-los e recolocá-los, revertendo todos os pares. Em termos das representações binárias das posições dos itens, isso complementa o bit de baixa ordem da posição.
Repetindo O (log N) vezes uma troca aleatória e uma troca pareada, podemos complementar todos os bits das representações binárias das posições - o que é o mesmo que reverter a lista.
fonte
O melhor algoritmo em que posso pensar exige transferências de uma fila para outra.∑N/2−1i=0(N−2i−2)
Vamos nomear duas filas disponíveis como esquerda e direita. Aqui está a idéia básica desse algoritmo com a suposição de que N é par:
É fácil ver como o algoritmo deve funcionar para N. ímpar
fonte