Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno
Con la quattordicesima generazione Lenovo ridisegna il suo ThinkPad più iconico attorno al nuovo Space Frame e ai processori Intel Core Ultra Series 3. Resta sotto 1Kg, è molto più semplice da riparare e si rivolge al professionista che lavora in mobilità, con un prezzo da prodotto di vertice.
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro
Le Jabra Evolve3 85 non sono semplicemente cuffie Bluetooth con cancellazione del rumore. Sono un dispositivo professionale pensato per chi trascorre gran parte della giornata in riunione, al telefono o davanti a un assistente basato sull'intelligenza artificiale
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 19-11-2006, 21:29   #1
Fuzzo
Senior Member
 
L'Avatar di Fuzzo
 
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2210
(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 Arctic Freezer Xtreme 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: Lenovo L14 Gen 3 / Mobile: Pixel 7a
Fuzzo è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2006, 21: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 20-11-2006, 00: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 20-11-2006, 00: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, 08: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, 08: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, 09: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, 10: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, 10:44   #9
Fuzzo
Senior Member
 
L'Avatar di Fuzzo
 
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2210
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 Arctic Freezer Xtreme 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: Lenovo L14 Gen 3 / Mobile: Pixel 7a
Fuzzo è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 12: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, 12: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, 12:20   #12
Fuzzo
Senior Member
 
L'Avatar di Fuzzo
 
Iscritto dal: Nov 2002
Città: Padova
Messaggi: 2210
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 Arctic Freezer Xtreme 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: Lenovo L14 Gen 3 / Mobile: Pixel 7a
Fuzzo è offline   Rispondi citando il messaggio o parte di esso
Old 20-11-2006, 14: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, 17: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, 18: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, 18: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, 18: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, 20: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, 21: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, 22: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


Lenovo ThinkPad X1 Carbon Gen 14: il business ultraleggero si rinnova dall’interno Lenovo ThinkPad X1 Carbon Gen 14: il business ul...
Jabra Evolve3 85: le cuffie sia per l'intrattenimento che per il lavoro Jabra Evolve3 85: le cuffie sia per l'intratteni...
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
I satelliti spia russi Kosmos 2613 e Kos...
GTA VI: online la nuova mega galleria co...
Edits, l'app di Instagram, sbarca gratis...
Claude Code: il bug che ha spedito l'ema...
Perplexity lancia Teammates, gli agenti ...
Niente più datacenter? Gli eletto...
La Cina avrebbe approvato lo sviluppo de...
Epson EF-72 alla prova: Google TV, audio...
AST SpaceMobile annuncia il razzo spazia...
Apple taglia il budget AI dei dipendenti...
Fisco e intelligenza artificiale, come c...
Synology BC510 e CC410W, la videosorvegl...
600.000 chip NVIDIA fermi a Hong Kong: l...
La Cina punta tutto sull'allunaggio con ...
LG Italia compie 30 anni: gli italiani v...
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: 05:48.


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