Come rilevare l'ordine dello stack?


8

Prendiamo la sequenza di numeri interi da a e li spingiamo su uno stack uno per uno in ordine. Tra ogni push, possiamo scegliere di estrarre qualsiasi numero di oggetti dalla pila (da 0 alla dimensione corrente della pila).1n

Ogni volta che estraiamo un valore dalla pila, lo stamperemo.

Ad esempio, viene stampato quando lo facciamo . viene da .1,2,3push, pop, push, pop, push, pop3,2,1push, push, push, pop, pop, pop

Tuttavia, non è una stampa possibile, poiché non è possibile avere stampati seguiti da , senza vedere in mezzo.3,1,2312

Domanda: Come possiamo rilevare ordini impossibili come ?3,1,2

In effetti, sulla base della mia osservazione, ho escogitato una potenziale soluzione. Ma il problema è che non posso dimostrare che la mia osservazione è completa.

Il programma che ho scritto con la seguente logica:

Quando il valore corrente meno il valore successivo è maggiore di 1, un valore tra corrente e successivo non può apparire dopo successivo. Ad esempio, se current = 3 e next = 1, il valore tra current (3) e next (1) è 2 che non può apparire dopo next (1), quindi viola la regola.3,1,2

Questo copre tutti i casi?


Risposte:


6

Non riuscivo a capire esattamente il tuo approccio (sembra corretto), ma esiste una semplice regola per ordini impossibili: l'ordine è impossibile ioff c'è un'io,un'j,un'K tale che un'io>un'K>un'j e io<j<K. A tale aun'io,un'j,un'K diciamo brutta tripla.

Perché? Per prima cosa dovresti dimostrare che se c'è una tripla cattiva, la sequenza è impossibile, ma questo è semplice e lo lascerò come esercizio (il numero medio non potrebbe apparire prima del più grande se non quello più piccolo prima di tutti).

Secondo, dovresti dimostrare che tutti gli ordini impossibili hanno almeno una tripla sbagliata, supponi di avere una sequenza senza alcuna tripla cattiva, potresti trovare l'ordine di push e pop quindi non è una sequenza impossibile. Per ricostruire gli ordini push e pop basta usare un approccio ingenuo (l'operazione è pop mentre si itera su numeri consecutivi), ma per la prova formale (per semplicità) è possibile utilizzare l'induzione, assumere per tutte le sequenze di lunghezzamse non c'è cattivo triplo non sono impossibili. Per sequenza di lunghezzan, puoi impostare le operazioni come pop (inizio dalla fine della sequenza), mentre ti imbatti in numeri consecutivi crescenti, ora hai una sequenza di lunghezza m, con m<n, senza una brutta tripla, quindi puoi ricostruire push e pop per questa sequenza, quindi una originale non era impossibile. l'inizio dell'induzione è una sequenza di lunghezza 3.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.