Vou tentar uma prova para mostrar que isso não pode ser feito.
Suponha que exista uma fila Q que seja simulada por 3 pilhas, A, B e C.
Asserções
ASRT0: = Além disso, suponha que Q possa simular operações {fila, desenfileiramento} em O (1). Isso significa que existe uma sequência específica de push / pops de pilha para cada operação de fila / desenfileiramento a ser simulada.
Sem perda de generalidade, assuma que as operações da fila são determinísticas.
Permita que os elementos enfileirados em Q sejam numerados 1, 2, ..., com base em sua ordem de fila, com o primeiro elemento enfileirado em Q definido como 1, o segundo como 2 e assim por diante.
Definir
Q(0) :=
O estado de Q quando existem 0 elementos em Q (e, portanto, 0 elementos em A, B e C)
Q(1) :=
O estado de Q (e A, B e C) após uma operação na fila em Q(0)
Q(n) :=
O estado de Q (e A, B e C) após n operações na fila em Q(0)
Definir
|Q(n)| :=
o número de elementos em Q(n)
(portanto|Q(n)| = n
)
A(n) :=
o estado da pilha A quando o estado de Q é Q(n)
|A(n)| :=
o número de elementos em A(n)
E definições semelhantes para as pilhas B e C.
Trivialmente,
|Q(n)| = |A(n)| + |B(n)| + |C(n)|
---
|Q(n)|
é obviamente ilimitado em n.
Portanto, pelo menos um de |A(n)|
, |B(n)|
ou|C(n)|
é ilimitado em n.
WLOG1
, suponha que a pilha A seja ilimitada e as pilhas B e C sejam limitadas.
Defina * B_u :=
um limite superior de B * C_u :=
um limite superior de C *K := B_u + C_u + 1
WLOG2
, para um n tal que |A(n)| > K
, selecione K elementos de Q(n)
. Suponha que um desses elementos esteja em A(n + x)
, para todos x >= 0
, ou seja, o elemento esteja sempre na pilha A, não importa quantas operações de fila sejam realizadas.
Então podemos definir
ASRT1 :=
O número de pops necessários para remover a fila de X Q(n)
é pelo menosAbv(n)
De ( ASRT0
) e ( ASRT1
),ASRT2 := Abv(n)
deve ser delimitado.
Se Abv(n)
for ilimitado, se forem necessários 20 desenfileiramentos para desenfileirar X de Q(n)
, será necessário pelo menosAbv(n)/20
pops. O que é ilimitado. 20 pode ser qualquer constante.
Portanto,
ASRT3 := Blo(n) = |A(n)| - Abv(n)
deve ser ilimitado.
WLOG3
, podemos selecionar os elementos K na parte inferior de A(n)
e um deles é A(n + x)
para todosx >= 0
X(n) :=
esse elemento, para qualquer dado n
ASRT4 := Abv(n) >= |A(n)| - K
Sempre que um elemento é enfileirado em Q(n)
...
WLOG4
, suponha que B e C já estejam preenchidos nos limites superiores. Suponha que o limite superior dos elementos acima X(n)
tenha sido atingido. Então, um novo elemento entra em A.
WLOG5
, suponha que, como resultado, o novo elemento deve entrar abaixo X(n)
.
ASRT5 :=
O número de pops necessários para colocar um elemento abaixo X(n) >= Abv(X(n))
De (ASRT4)
, Abv(n)
é ilimitado em n.
Portanto, o número de pops necessários para colocar um elemento abaixo X(n)
é ilimitado.
Isso contradiz ASRT1
, portanto, não é possível simular uma O(1)
fila com 3 pilhas.
Ou seja,
Pelo menos 1 pilha deve ser ilimitada.
Para um elemento que permanece nessa pilha, o número de elementos acima dele deve ser limitado ou a operação de desenfileiramento para remover esse elemento será ilimitada.
No entanto, se o número de elementos acima dele for limitado, ele atingirá um limite. Em algum momento, um novo elemento deve entrar abaixo dele.
Como sempre podemos escolher o elemento antigo dentre um dos poucos elementos mais baixos dessa pilha, pode haver um número ilimitado de elementos acima dele (com base no tamanho ilimitado da pilha ilimitada).
Para inserir um novo elemento abaixo dele, como há um número ilimitado de elementos acima dele, é necessário um número ilimitado de pops para colocar o novo elemento abaixo dele.
E assim a contradição.
Existem 5 declarações WLOG (sem perda de generalidade). Em certo sentido, eles podem ser intuitivamente entendidos como verdadeiros (mas, como são 5, pode levar algum tempo). A prova formal de que nenhuma generalidade é perdida pode ser obtida, mas é extremamente longa. Eles são omitidos.
Admito que essa omissão possa deixar as declarações do WLOG em questão. Com a paranóia de um programador quanto a erros, verifique as instruções do WLOG, se desejar.
A terceira pilha também é irrelevante. O que importa é que há um conjunto de pilhas limitadas e um conjunto de pilhas ilimitadas. O mínimo necessário para um exemplo é 2 pilhas. O número de pilhas deve ser, obviamente, finito.
Por fim, se eu estiver certo de que não há provas, deve haver uma prova indutiva mais fácil disponível. Provavelmente, com base no que acontece após cada fila (acompanhe como isso afeta o pior caso de desenfileiramento, considerando o conjunto de todos os elementos na fila).