Torna indietro   Hardware Upgrade Forum > Software > Programmazione

iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile
C'è tanta sostanza nel nuovo smartphone della Mela dedicato ai creator digitali. Nuovo telaio in alluminio, sistema di raffreddamento vapor chamber e tre fotocamere da 48 megapixel: non è un semplice smartphone, ma uno studio di produzione digitale on-the-go
Intel Panther Lake: i processori per i notebook del 2026
Intel Panther Lake: i processori per i notebook del 2026
Panther Lake è il nome in codice della prossima generazione di processori Intel Core Ultra, che vedremo al debutto da inizio 2026 nei notebook e nei sistemi desktop più compatti. Nuovi core, nuove GPU e soprattutto una struttura a tile che vede per la prima volta l'utilizzo della tecnologia produttiva Intel 18A: tanta potenza in più, ma senza perdere in efficienza
Intel Xeon 6+: è tempo di Clearwater Forest
Intel Xeon 6+: è tempo di Clearwater Forest
Intel ha annunciato la prossima generazione di processori Xeon dotati di E-Core, quelli per la massima efficienza energetica e densità di elaborazione. Grazie al processo produttivo Intel 18A, i core passano a un massimo di 288 per ogni socket, con aumento della potenza di calcolo e dell'efficienza complessiva.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-11-2006, 20:29   #1
Fuzzo
Senior Member
 
L'Avatar di Fuzzo
 
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
Fuzzo è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2006, 20:45   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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).
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2006, 23:03   #3
71104
Bannato
 
L'Avatar di 71104
 
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.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2006, 23:37   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
se non ha spazio può espandere l'array, è pesante ma sempre O(1).
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 07:23   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da PGI-Bis
se non ha spazio può espandere l'array, è pesante ma sempre O(1).
se espande l'array ottiene delle locazioni oltre la fine, ma se non ha spazio per fare il push reversed lo spazio che gli manca non è alla fine, è all'inizio (gli servirebbero locazioni prima dello 0). potrebbe ottenere le locazioni alla fine e fare la gestione ciclica in effetti, ma è inutile perché per realizzare tutti gli algoritmi in O(1) la dimensione massima dello stack deve essere nota a priori, altrimenti (assumendo di gestire l'array ciclico) si presenta il seguente problema: ho N locazioni da 0 a N-1, faccio K push "in avanti", metto il flag di reverse, e faccio N-K push all'indietro; ho riempito tutto l'array. ora che succede se faccio un altro push? altre locazioni la posso ottenere solo alla fine dell'array, ma non è lì che voglio mettere il mio nuovo elemento...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 07:52   #6
thebol
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
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 08:52   #7
71104
Bannato
 
L'Avatar di 71104
 
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...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 09:38   #8
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da 71104
infatti così funziona, ma io avevo capito che il realizzare lo stack utilizzando un array era un requisito...
dal post non sembra un requisito


ps.scusate la niubbaggine, ma sono a digiuno di c & company da molto....ma come si espande un array?
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 09:44   #9
Fuzzo
Senior Member
 
L'Avatar di Fuzzo
 
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2206
Grazie ragazzi!
Desidero aggiungere qualche informazione al mio precedente post:
  • Nessuna (double)linked list, lo stack è gestito con un Array di Object classico
  • Se riempio l'array, in automatico viene chiamato il metodo espandi() che duplica la dimensione dell'array e copia gli elementi (questo metodo non deve essere O(1))
  • Nessuna gestione dell'Array a ciclo

Quote:
PGI-Bis
se non ha spazio può espandere l'array, è pesante ma sempre O(1).
Come faccio ad espandere l'array in O(1)? La copia degli elementi dal vecchio al nuovo non mi spara la complessità ad O(n)?

Quote:
71104
se espande l'array ottiene delle locazioni oltre la fine, ma se non ha spazio per fare il push reversed lo spazio che gli manca non è alla fine, è all'inizio (gli servirebbero locazioni prima dello 0). potrebbe ottenere le locazioni alla fine e fare la gestione ciclica in effetti, ma è inutile perché per realizzare tutti gli algoritmi in O(1) la dimensione massima dello stack deve essere nota a priori, altrimenti (assumendo di gestire l'array ciclico) si presenta il seguente problema: ho N locazioni da 0 a N-1, faccio K push "in avanti", metto il flag di reverse, e faccio N-K push all'indietro; ho riempito tutto l'array. ora che succede se faccio un altro push? altre locazioni la posso ottenere solo alla fine dell'array, ma non è lì che voglio mettere il mio nuovo elemento...
Hai centrato il punto!

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
Fuzzo è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 11:08   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Come faccio ad espandere l'array in O(1)? La copia degli elementi dal vecchio al nuovo non mi spara la complessità ad O(n)?
se in C usi la realloc è improbabile che il blocco debba essere spostato e quindi ricopiato, ma tu stai usando new quindi si, è O(n) perché lo devi ricopiare.

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?
ottima idea... non ci avevo pensato!

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:
  • push aggiunge un elemento all'array puntato da *A (lo esapnde se necessario)
  • pop leva un elemento dall'array puntato da *A
  • reverse scambia i valori di *A e *B

fine :|

è geniale!!
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 11:15   #11
thebol
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)
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 11:20   #12
Fuzzo
Senior Member
 
L'Avatar di Fuzzo
 
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
Fuzzo è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 13:29   #13
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 16:22   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da thebol
si però utilizzi il doppio della memoria
si ma solo nel caso pessimo: nel caso ottimale ne usi esattamente tanta quanta te ne serve. in certi casi può risultare meglio della lista doppiamente linkata, dove ne usi sempre e comunque di più
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 17:04   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 17:09   #16
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da PGI-Bis
Perchè solo nel caso pessimo? A me sembra che sia sempre il doppio come dice thebol.
no: è il doppio (anzi per l'esattezza il doppio meno 1) solo quando entrambi gli array sono stati entrambi riallocati; ma se sono entrambi pieni li sfrutti al meglio.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 17:19   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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?
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 19:37   #18
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
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.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 20:59   #19
71104
Bannato
 
L'Avatar di 71104
 
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][ ][ ][ ][ ][ ]
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 21:04   #20
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da PGI-Bis
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?
L'idea e' molto chiara se immagini di "appicicare" le basi dei due array per farne uno che abbia gli elementi che invece di partire da un lato partano dal centro.
Riscrivendo il disegno di sopra nel seguente modo:
Codice:
[ ][ ][ ][ ][ ][ ] B A [ ][ ][ ][ ][ ][ ]
Forse ti sara' piu' chiaro.
Parti con A e aggiungi verso destra
Codice:
                      -->
[ ][ ][ ][ ][ ][ ] B A [x][ ][ ][ ][ ][ ]
...
[ ][ ][ ][ ][ ][ ] B A [x][x][x][x][x][x]
Quando riempi a semplicemente espandi il doppio array verso destra
Codice:
[ ][ ][ ][ ][ ][ ] B A [x][x][x][x][x][x][ ][ ][ ][ ][ ][ ]
Quando fai la reverse scambi di ruolo i due array e cominci ad aggiugnere a sinistra
Codice:
               <--
[ ][ ][ ][ ][x][x] B A [x][x][x][x][x][x][ ][ ][ ][ ][ ][ ]
Per gestire il caso pila vuota basta tenere un contatore.
__________________
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


iPhone 17 Pro: più di uno smartphone. È uno studio di produzione in formato tascabile iPhone 17 Pro: più di uno smartphone. &Eg...
Intel Panther Lake: i processori per i notebook del 2026 Intel Panther Lake: i processori per i notebook ...
Intel Xeon 6+: è tempo di Clearwater Forest Intel Xeon 6+: è tempo di Clearwater Fore...
4K a 160Hz o Full HD a 320Hz? Titan Army P2712V, a un prezzo molto basso 4K a 160Hz o Full HD a 320Hz? Titan Army P2712V,...
Recensione Google Pixel Watch 4: basta sollevarlo e si ha Gemini sempre al polso Recensione Google Pixel Watch 4: basta sollevarl...
MindsEye, rivolta dei dipendenti contro ...
In Cina Xiaomi SU7 Ultra prende fuoco do...
Apple Smart Glass: display integrato e d...
Mortal Kombat 3 si farà: la confe...
iPhone 18 Pro: prime indiscrezioni sulle...
Vai all'università? Hai un anno d...
Rubrik accelera su IA e sicurezza: tra c...
Nuovo Nothing Phone (3) in offerta su Am...
Roborock Qrevo Edge in offerta su Amazon...
Polizia statunitense mette in guardia: s...
EUREKA J15 Ultra ed Evo Ultra in offerta...
L'Olanda 'nazionalizza' il produttore di...
Robot Lefant M2 Pro in offerta su Amazon...
Ultimi 2 giorni di sconti sui dispositiv...
TP-Link è già proiettata a...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:15.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v