Proverò una prova per dimostrare che non può essere fatto.
Supponiamo che ci sia una coda Q che è simulata da 3 pile, A, B e C.
asserzioni
ASRT0: = Inoltre, supponi che Q possa simulare le operazioni {coda, dequeue} in O (1). Ciò significa che esiste una sequenza specifica di stack push / pop per ogni operazione di coda / dequeue da simulare.
Senza perdita di generalità, supponiamo che le operazioni in coda siano deterministiche.
Consenti agli elementi in coda in Q di essere numerati 1, 2, ..., in base al loro ordine di coda, con il primo elemento in coda in Q definito come 1, il secondo in 2 e così via.
Definire
Q(0) :=
Lo stato di Q quando ci sono 0 elementi in Q (e quindi 0 elementi in A, B e C)
Q(1) :=
Lo stato di Q (e A, B e C) dopo 1 operazione di coda attivata Q(0)
Q(n) :=
Lo stato di Q (e A, B e C) dopo n operazioni in coda attivate Q(0)
Definire
|Q(n)| :=
il numero di elementi in Q(n)
(quindi |Q(n)| = n
)
A(n) :=
lo stato dello stack A quando lo stato di Q è Q(n)
|A(n)| :=
il numero di elementi in A(n)
E definizioni simili per le pile B e C.
Banalmente,
|Q(n)| = |A(n)| + |B(n)| + |C(n)|
---
|Q(n)|
è ovviamente illimitato su n.
Pertanto, almeno uno dei |A(n)|
, |B(n)|
o |C(n)|
è illimitato su n.
WLOG1
, supponiamo che lo stack A sia illimitato e che gli stack B e C siano limitati.
Definisci * B_u :=
un limite superiore di B * C_u :=
un limite superiore di C *K := B_u + C_u + 1
WLOG2
, per una n tale che |A(n)| > K
, selezionare K elementi da Q(n)
. Supponiamo che 1 di questi elementi sia A(n + x)
, per tutti x >= 0
, cioè che l'elemento sia sempre nello stack A, indipendentemente da quante operazioni di coda sono state eseguite.
Quindi possiamo definire
ASRT1 :=
Il numero di pop richiesti per dequeue X Q(n)
è almenoAbv(n)
Da ( ASRT0
) e ( ASRT1
), ASRT2 := Abv(n)
deve essere limitato.
Se Abv(n)
è illimitato, quindi se sono necessari 20 dequeues per dequeue X Q(n)
, richiederà almeno Abv(n)/20
pop. Che è illimitato. 20 può essere qualsiasi costante.
Perciò,
ASRT3 := Blo(n) = |A(n)| - Abv(n)
deve essere illimitato.
WLOG3
, possiamo selezionare gli elementi K dalla parte inferiore di A(n)
e uno di questi è disponibile A(n + x)
per tuttix >= 0
X(n) :=
quell'elemento, per ogni dato n
ASRT4 := Abv(n) >= |A(n)| - K
Ogni volta che un elemento viene messo in coda in Q(n)
...
WLOG4
, supponiamo che B e C siano già riempiti fino ai limiti superiori. Supponiamo che X(n)
sia stato raggiunto il limite superiore per gli elementi sopra . Quindi, un nuovo elemento entra in A.
WLOG5
, supponiamo che, di conseguenza, il nuovo elemento debba entrare di seguito X(n)
.
ASRT5 :=
Il numero di pop richiesti per inserire un elemento di seguito X(n) >= Abv(X(n))
Da (ASRT4)
, Abv(n)
non ha limiti il n.
Pertanto, il numero di pop richiesti per inserire un elemento di seguito X(n)
è illimitato.
Ciò contraddice ASRT1
, pertanto, non è possibile simulare una O(1)
coda con 3 pile.
ie
Almeno 1 stack deve essere illimitato.
Per un elemento che rimane in quella pila, il numero di elementi sopra di esso deve essere limitato oppure l'operazione di dequeue per rimuovere tale elemento non sarà limitata.
Tuttavia, se il numero di elementi sopra di esso è limitato, raggiungerà un limite. Ad un certo punto, un nuovo elemento deve entrare sotto di esso.
Dato che possiamo sempre scegliere il vecchio elemento tra uno dei pochi elementi più bassi di quello stack, può esserci un numero illimitato di elementi sopra di esso (basato sulla dimensione illimitata dello stack illimitato).
Per inserire un nuovo elemento al di sotto di esso, poiché sopra di esso è presente un numero illimitato di elementi, è necessario un numero illimitato di pop per posizionare il nuovo elemento al di sotto di esso.
E quindi la contraddizione.
Ci sono 5 dichiarazioni WLOG (senza perdita di generalità). In un certo senso, possono essere compresi intuitivamente come veri (ma dato che sono 5, potrebbe richiedere del tempo). La prova formale che non si perde alcuna generalità può essere derivata, ma è estremamente lunga. Sono stati omessi.
Ammetto che tale omissione potrebbe lasciare in discussione le dichiarazioni WLOG. Con la paranoia di un programmatore per i bug, ti preghiamo di verificare le istruzioni WLOG, se lo desideri.
Anche il terzo stack è irrilevante. Ciò che conta è che esiste una serie di pile illimitate e una serie di pile illimitate. Il minimo necessario per un esempio è di 2 pile. Il numero di pile deve essere, ovviamente, finito.
Infine, se ho ragione sul fatto che non ci sono prove, allora dovrebbe esserci una prova induttiva più semplice disponibile. Probabilmente in base a ciò che accade dopo ogni coda (tenere traccia di come influenza il peggior caso di dequeue dato l'insieme di tutti gli elementi nella coda).