Je vais tenter une preuve pour montrer que cela ne peut pas être fait.
Supposons qu'il existe une file d'attente Q simulée par 3 piles, A, B et C.
Assertions
ASRT0: = De plus, supposons que Q puisse simuler des opérations {queue, dequeue} dans O (1). Cela signifie qu'il existe une séquence spécifique de push / pop de pile pour chaque opération de file d'attente / de retrait à simuler.
Sans perte de généralité, supposons que les opérations de file d'attente sont déterministes.
Laissez les éléments mis en file d'attente dans Q numérotés 1, 2, ..., en fonction de leur ordre de file d'attente, le premier élément mis en file d'attente dans Q étant défini comme 1, le second comme 2, et ainsi de suite.
Définir
Q(0) :=
L'état de Q quand il y a 0 élément dans Q (et donc 0 élément dans A, B et C)
Q(1) :=
L'état de Q (et A, B et C) après 1 opération de file d'attente sur Q(0)
Q(n) :=
L'état de Q (et A, B et C) après n opérations de file d'attente sur Q(0)
Définir
|Q(n)| :=
le nombre d'éléments dans Q(n)
(donc |Q(n)| = n
)
A(n) :=
l'état de la pile A lorsque l'état de Q est Q(n)
|A(n)| :=
le nombre d'éléments dans A(n)
Et des définitions similaires pour les piles B et C.
Trivialement,
|Q(n)| = |A(n)| + |B(n)| + |C(n)|
---
|Q(n)|
est évidemment illimité sur n.
Par conséquent, au moins un de |A(n)|
, |B(n)|
ou |C(n)|
est illimité sur n.
WLOG1
, supposons que la pile A est illimitée et que les piles B et C sont limitées.
Définir * B_u :=
une borne supérieure de B * C_u :=
une borne supérieure de C *K := B_u + C_u + 1
WLOG2
, pour un n tel que |A(n)| > K
, sélectionnez K éléments dans Q(n)
. Supposons que 1 de ces éléments soit dans A(n + x)
, pour tous x >= 0
, c'est-à-dire que l'élément est toujours dans la pile A quel que soit le nombre d'opérations de file d'attente effectuées.
Ensuite, nous pouvons définir
ASRT1 :=
Le nombre de pop requis pour retirer X de la file d'attente Q(n)
est d'au moinsAbv(n)
De ( ASRT0
) et ( ASRT1
), ASRT2 := Abv(n)
doivent être délimités.
Si Abv(n)
est illimité, alors si 20 sorties de file d'attente sont nécessaires pour retirer X de la file d'attente Q(n)
, il faudra au moins Abv(n)/20
pops. Ce qui est illimité. 20 peut être n'importe quelle constante.
Par conséquent,
ASRT3 := Blo(n) = |A(n)| - Abv(n)
doit être illimité.
WLOG3
, nous pouvons sélectionner les éléments K à partir du bas de A(n)
, et l'un d'eux est A(n + x)
pour tousx >= 0
X(n) :=
cet élément, pour tout n donné
ASRT4 := Abv(n) >= |A(n)| - K
Chaque fois qu'un élément est mis en file d'attente dans Q(n)
...
WLOG4
, supposons que B et C soient déjà remplis jusqu'à leurs limites supérieures. Supposons que la limite supérieure des éléments ci-dessus X(n)
a été atteinte. Ensuite, un nouvel élément entre A.
WLOG5
, supposons qu'en conséquence, le nouvel élément doit entrer ci-dessous X(n)
.
ASRT5 :=
Le nombre de pops requis pour mettre un élément ci-dessous X(n) >= Abv(X(n))
De (ASRT4)
, Abv(n)
est illimité sur n.
Par conséquent, le nombre de pops requis pour placer un élément ci X(n)
- dessous est illimité.
Cela contredit ASRT1
, par conséquent, il n'est pas possible de simuler une O(1)
file d'attente avec 3 piles.
C'est à dire
Au moins 1 pile doit être illimitée.
Pour un élément qui reste dans cette pile, le nombre d'éléments au-dessus doit être limité, ou l'opération de retrait de la file d'attente pour supprimer cet élément sera illimitée.
Cependant, si le nombre d'éléments au-dessus est limité, il atteindra une limite. À un moment donné, un nouvel élément doit entrer en dessous.
Puisque nous pouvons toujours choisir l'ancien élément parmi l'un des quelques éléments les plus bas de cette pile, il peut y avoir un nombre illimité d'éléments au-dessus (en fonction de la taille illimitée de la pile illimitée).
Pour entrer un nouvel élément en dessous, comme il y a un nombre illimité d'éléments au-dessus, un nombre illimité de pops est nécessaire pour placer le nouvel élément en dessous.
Et donc la contradiction.
Il existe 5 instructions WLOG (sans perte de généralité). Dans un certain sens, ils peuvent être intuitivement compris comme vrais (mais étant donné qu'ils sont 5, cela peut prendre un certain temps). La preuve formelle qu'aucune généralité n'est perdue peut être obtenue, mais elle est extrêmement longue. Ils sont omis.
J'admets qu'une telle omission pourrait laisser les déclarations WLOG en question. Avec la paranoïa d'un programmeur pour les bogues, veuillez vérifier les instructions WLOG si vous le souhaitez.
La troisième pile n'est pas non plus pertinente. Ce qui compte, c'est qu'il y ait un ensemble de piles délimitées et un ensemble de piles illimitées. Le minimum nécessaire pour un exemple est de 2 piles. Le nombre de piles doit être, bien entendu, fini.
Enfin, si j'ai raison de dire qu'il n'y a pas de preuve, alors il devrait y avoir une preuve inductive plus facile disponible. Probablement basé sur ce qui se passe après chaque file d'attente (gardez une trace de la façon dont cela affecte le pire cas de retrait de la file d'attente étant donné l'ensemble de tous les éléments de la file d'attente).