Voglio iniziare dicendo che questa NON è una domanda da fare a casa. Sto leggendo Introduzione agli algoritmi - il famoso testo CLRS per diventare un programmatore migliore. Sto cercando di risolvere da solo i problemi e gli esercizi dati nel libro.
Sto cercando di risolvere Excercise 10.1-2 dal capitolo 10 Strutture di dati elementari della seconda edizione di CLRS. Ecco cosa afferma:
Spiegare come implementare due stack in un array A [1..n] in modo tale che nessuno degli stack trabocchi a meno che il numero totale di elementi in entrambi gli stack sia n . Le operazioni PUSH e POP dovrebbero essere eseguite in O (1) .
La soluzione che ho escogitato finora è:
Consenti all'array A [1..n] di implementare due stack: S1 [1..i] e S2 [i..n] .
Per le operazioni PUSH-S1 e PUSH-S2 , se lo stack è "pieno", iniziare a spingere gli elementi nell'altro stack (ad es. Se lo stack S1 è pieno quando un nuovo elemento sta cercando di essere inserito, quindi spingere quell'elemento in stack S2 e viceversa).
Il problema con questo approccio è che non sarò in grado di POP-S1 o POP-S2 in modo affidabile poiché non c'è modo di "ricordare" quale elemento appartiene a quale stack. Se gli elementi dello stack sono coppie (chiave, valore) , la chiave è il numero dello stack, quindi per far apparire un elemento dovrei cercare, nel peggiore dei casi, i o (ni) volte - che sarà O (n ) (sentiti libero di correggermi se sbaglio qui), che non sarebbe O (1) .
Sto sbattendo la testa sulla domanda da un po 'di tempo ormai. Sono sulla buona strada? Qualcuno può dare i miei possibili suggerimenti per risolvere questo problema?
In generale, come dovrei "pensare" a questi problemi? O solo le persone veramente intelligenti possono risolvere questo tipo di problemi? Affrontare / risolvere problemi come questi (ovvero acquisire esperienza) mi aiuterà a migliorare in questo?
Attendo l'illuminazione.