Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla
OPPO Watch X2 Mini è uno smartwatch compatto capace di offrire un'esperienza completa di monitoraggio della salute e fitness con una cassa da 43 mm che può adattarsi a qualsiasi tipo di polso, dal più grande al - soprattutto - più piccolo. Con l'architettura dual-chip e un'autonomia che può coprire due giorni con tranquillità, rappresenta la soluzione ideale per chi cerca prestazioni premium in un formato ridotto.
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione
Dopo il recente lancio della serie Xiaomi 15T di Monaco, vi parliamo oggi della versione più performante della nuova famiglia, ovvero Xiaomi 15 T Pro. Vi raccontiamo la nostra prova nel dettaglio, spiegando perché a questo prezzo e in questa fascia, questo smartphone ha davvero senso tenerlo in seria considerazione.
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento
Acer ha ampliato la sua offerta professionale con il TravelMate P6 14 AI, un notebook ultraleggero e robusto pensato per chi lavora in mobilità. Certificato Copilot+ PC, combina design premium, autonomia elevata e piattaforma Intel Core Ultra Serie 2 con funzionalità AI, garantendo sicurezza, affidabilità e produttività per l'utenza business moderna.
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


OPPO Watch X2 Mini, lo smartwatch compatto a cui non manca nulla OPPO Watch X2 Mini, lo smartwatch compatto a cui...
Xiaomi 15T Pro, è lui il nuovo best buy? La recensione Xiaomi 15T Pro, è lui il nuovo best buy? ...
Acer TravelMate P6 14 AI: il Copilot+ PC sotto il chilo per il professionista in movimento Acer TravelMate P6 14 AI: il Copilot+ PC sotto i...
ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondono completezza e duttilità ASUS NUC 15 Pro e NUC 15 Pro+, mini PC che fondo...
Cybersecurity: email, utenti e agenti IA, la nuova visione di Proofpoint Cybersecurity: email, utenti e agenti IA, la nuo...
Caos nell'impero Musk: perché i m...
Microsoft Sentinel si evolve e diventa u...
La navicella spaziale Orion per le missi...
Gmail, gli utenti aziendali possono invi...
Il Moige contro Meta e TikTok: via a un'...
La NASA potrebbe impiegare dei lander lu...
Bezos: l'intelligenza artificiale vive u...
Allarme sicurezza: TikTok suggerisce con...
Apple non potrà più pubbli...
Prime Day fa volare MOVA: super sconti f...
Hoover HMC5 è l'alleato perfetto contro ...
LG porta webOS 25 sui TV degli anni pass...
ECOVACS DEEBOT T50 OMNI in offerta a 399...
TIM Enterprise investirà 1 miliar...
Google Pixel 10, prezzo bomba di 649€ su...
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: 17:32.


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