|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2206
|
(JAVA) Realizzare stack con complessita' O(1)...
Salve a tutti!
Ho scritto una classe Stack (relizzato con un array) ma nel farlo ho tralasciato un particolare: tutte le funzioni devono avere complessita' costante O(1). Si tratta di: push(Object); pop(); top(); isEmpty(); reverse(); Per le prime 4 credo si possa fare con un campo dati che indica la posizione del prossimo oggetto: push diventa un'assegnazione, top un return, pop un return e un'assegnazione. isEmpty e' gia' O(1). Il problema ce l'ho con reverse, che inverte a specchio tutti gli elementi dello stack ![]() Questo non saprei farlo senza un for che mi fa salire la complessita' ad O(n). Qualche idea? Grazie in anticipo! ![]()
__________________
Fisso: Case Corsair Carbide 275Q PSU Seasonic Focus GX-850 MB Asus TUF GAMING X570-PLUS CPU AMD Ryzen 3900x Cooler AMD Wrait Prism RAM 2*16GB G.Skill RipJaws V DDR4 3200MHz VGA EVGA GeForce RTX 2060 Super 8GB Monitor Asus VX239H SSD 2*ADATA XPG SX8200 PRO 1TB Raid0 Router Netgear DGND4000 SO Windows 10 Print&Scan Epson WF-4830 / Laptop: Dell XPS L502X / Mobile: Pixel 7a |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
A naso direi che basti assegnare al riferimento (indice nel caso di un array) che punta al nodo di inserimento-estrazione il valore del nodo opposto. Il che è più o meno complicato a seconda di come hai realizzato i nodi perchè può richiedere un mutamento nel modo in cui ora realizzi le operazioni pop-peek-push, ferma la complessità O(1).
|
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
potresti tenerti un flag che indica se l'array è reversed oppure no, ma il problema è che se fai un push all'array reversed non hai spazio... potresti fare un array gestito "a ciclo": se l'array è di N locazioni, un "reversed push" oltre la 0 causa una scrittura alla N-1. ma ovviamente devi conoscere in anticipo la dimensione massima dello stack.
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
se non ha spazio può espandere l'array, è pesante ma sempre O(1).
|
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
doublelinkedlist, un puntatore all'ultimo elemento inserito, un puntatore al primo elemento inserito(per la reverse), un booleano per la direzione(e per capire se quando fai pop poi devi usare il prev o il succ, uguale per la push)
naturlamente devi gestire la doublelinkedlist, oppure usarne una gia fatta. ps.cosi a sentimento eh, potrebbe essere una castroneria ![]() |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
infatti così funziona, ma io avevo capito che il realizzare lo stack utilizzando un array era un requisito...
![]() |
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
Quote:
ps.scusate la niubbaggine, ma sono a digiuno di c & company da molto....ma come si espande un array? |
|
![]() |
![]() |
![]() |
#9 | ||
Senior Member
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2206
|
Grazie ragazzi!
![]() Desidero aggiungere qualche informazione al mio precedente post:
Quote:
Quote:
![]() Idea: e se ad ogni push e pop al posto di mettere e togliere da un solo array metto e tolgo da 2 array distinti? Uno ovviamente è gestito "al contrario" del seconddo. Così facendo la reverse non fa altro che cambiare i due riferiementi... che ne dite?
__________________
Fisso: Case Corsair Carbide 275Q PSU Seasonic Focus GX-850 MB Asus TUF GAMING X570-PLUS CPU AMD Ryzen 3900x Cooler AMD Wrait Prism RAM 2*16GB G.Skill RipJaws V DDR4 3200MHz VGA EVGA GeForce RTX 2060 Super 8GB Monitor Asus VX239H SSD 2*ADATA XPG SX8200 PRO 1TB Raid0 Router Netgear DGND4000 SO Windows 10 Print&Scan Epson WF-4830 / Laptop: Dell XPS L502X / Mobile: Pixel 7a |
||
![]() |
![]() |
![]() |
#10 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
![]() ![]() non serve neanche che li "gestisci al contrario" come dici tu, basta che siano due!! supponi di avere due array, A e B, e di conoscerli tramite i rispettivi puntatori *A e *B:
fine :| è geniale!! ![]() |
||
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
si però utilizzi il doppio della memoria
![]() certo che però funziona e ti tieni l'O(1) ![]() |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2206
|
Certo, utilizzo il doppio della memoria ma mi rimane O(1), che è il mio scopo finale
![]() Grazie ragazzi ![]()
__________________
Fisso: Case Corsair Carbide 275Q PSU Seasonic Focus GX-850 MB Asus TUF GAMING X570-PLUS CPU AMD Ryzen 3900x Cooler AMD Wrait Prism RAM 2*16GB G.Skill RipJaws V DDR4 3200MHz VGA EVGA GeForce RTX 2060 Super 8GB Monitor Asus VX239H SSD 2*ADATA XPG SX8200 PRO 1TB Raid0 Router Netgear DGND4000 SO Windows 10 Print&Scan Epson WF-4830 / Laptop: Dell XPS L502X / Mobile: Pixel 7a |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Per espandere l'array crei un nuovo array più grande e usi System.arraycopy per trasferire il blocco di memoria rappresentato dal vecchio nel nuovo, a partire da un certo offset.
|
![]() |
![]() |
![]() |
#14 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Perchè solo nel caso pessimo? A me sembra che sia sempre il doppio come dice thebol.
|
![]() |
![]() |
![]() |
#16 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Allora non ho capito la soluzione. Hai due array A e B:
A [ ][ ][ ][ ][ ][ ] B [ ][ ][ ][ ][ ][ ] push aggiunge un elemento ad A. Con due push (o segnala il cursore): A [x][o][ ][ ][ ][ ] B [ ][ ][ ][ ][ ][ ] Cos'è che fa reverse ora? |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Uppo, 71104: sai che noi matti siamo curiosi
![]() Magari è persino meglio della soluzione ad array unico. Non farti pregare. |
![]() |
![]() |
![]() |
#19 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
e sta calmo, stavo a magnà
![]() hai questi: A [x][o][ ][ ][ ][ ] B [ ][ ][ ][ ][ ][ ] ora se fai reverse non cambia nulla, però grazie al fatto che tu scambi i puntatori ciò che tu vedi è questo: A [o][ ][ ][ ][ ][ ] B [x][ ][ ][ ][ ][ ] |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Riscrivendo il disegno di sopra nel seguente modo: Codice:
[ ][ ][ ][ ][ ][ ] B A [ ][ ][ ][ ][ ][ ] Parti con A e aggiungi verso destra Codice:
--> [ ][ ][ ][ ][ ][ ] B A [x][ ][ ][ ][ ][ ] ... [ ][ ][ ][ ][ ][ ] B A [x][x][x][x][x][x] Codice:
[ ][ ][ ][ ][ ][ ] B A [x][x][x][x][x][x][ ][ ][ ][ ][ ][ ] Codice:
<-- [ ][ ][ ][ ][x][x] B A [x][x][x][x][x][x][ ][ ][ ][ ][ ][ ]
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:32.