|
|
|
![]() |
|
Strumenti |
![]() |
#21 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Ok, non ho capito
![]() push Pippo: A [Pippo][null][null][null]... B [null][null][null]... push Gianni e push Mario A [Pippo][Gianni][Mario][null] B [null][null][null]... peek restituisce "Mario" (ultimo inserito nella pila). Ora faccio un reverse e scambio i puntatori. Cioè se faccio peek() l'array sottostante non è più A ma B (è così?). E questo peek mi restituisce Pippo? ![]() ![]() |
![]() |
![]() |
![]() |
#22 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Grazie marco.r, ora ho capito. Ammazza che roba complicata.
push, push, push [ ][ ][ ][ ][ ][ ]BA[x][x][x][ ][ ][ ][ ] reverse, push, push, push, push, push [ ][ ][x][x][x][x]BA[x][x][x][ ][ ][ ][ ] reverse, pop, pop, pop, pop, pop [ ][ ][x][x][ ][ ]BA[ ][ ][ ][ ][ ][ ][ ] reverse, push [ ][ ][x][x][ ][ ]BA[x][ ][ ][ ][ ][ ][ ] e mo? Se faccio due pop? O mi sono incasinato io? ![]() |
![]() |
![]() |
![]() |
#23 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Codice:
[ ][ ][x][x][ ][ ]BA[ ][ ][ ][ ][ ][ ][ ] ^ ^ | | left right [ ][ ][x][x][x][ ]BA[ ][ ][ ][ ][ ][ ][ ] ^ ^ | | left right ![]() Ora ti faccio un rapido prototipo in python, cosi' capisci meglio :P. N.B.: E' chiaro che con una implementazione del genere nel caso peggiore l'occupazione di memoria cresce indefinitamente anche con pochi elementi. Visto che non sempre potro' ridurre le dimensioni degli array.
__________________
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 |
|
![]() |
![]() |
![]() |
#24 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Mi pare d'aver capito. Penso che in una scala di voti da zero a trenta una cosa del genere valga trenta. Frustate.
![]() |
![]() |
![]() |
![]() |
#25 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Codice:
import Numeric class Pila: def __init__(self,initial_size): self.head = 0 # Prossima casella libera self.tail = -1 # Casella prima della coda A = Numeric.zeros(initial_size) B = Numeric.zeros(initial_size) self.other = { id(A) : B, id(B) : A } self.size = 0 self.head_array = A self.tail_array = A self.direction = +1 def check_push_bounds(self): # sforo "in alto" if self.direction == +1 and self.head == len(self.head_array): other_array = self.other[ id(self.head_array) ] new_size = len(self.head_array) * 2 new_head = Numeric.resize( self.head_array, (new_size,) ) self.other = { id(new_head) : other_array, id(other_array) : new_head } if self.tail_array == self.head_array: self.tail_array = new_head self.head_array = new_head # sforo in basso, devo passare all'altro array if self.direction == -1 and self.head == -1: self.head_array = self.other[ id(self.head_array) ] self.direction = 1 self.head = 0 def push(self,x): self.check_push_bounds() self.head_array[ self.head ] = x self.head+= self.direction self.size += 1 def peek(self): if self.size == 0: raise Exception('Empty Stack') return self.head_array[ self.head - self.direction ] def check_pop_bounds(self): if self.direction == -1 and self.head == 0: self.head_array = self.other[ id(self.head_array) ] self.direction = 1 def pop(self): if self.size == 0: raise Exception('Empty Stack') self.check_pop_bounds() self.head -= self.direction self.size -= 1 def reverse(self): x = self.head self.head = self.tail self.tail = x x = self.head_array self.head_array = self.tail_array self.tail_array = x if self.head_array == self.tail_array: self.direction *= -1 ![]()
__________________
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 |
![]() |
![]() |
![]() |
#26 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Usa un verme solo.
Codice:
ArrayStack array dati intero cursore, coda, numeroTotaleElementi booleano invertita push valore cursore = cellaSuccessiva(cursore) dati[cursore] = valore aumenta di 1 numeroTotaleElementi espandi array se necessario valore pop valore = dati[cursore] cursore = cellaPrecedente(cursore) riduci di 1 numeroTotaleElementi reverse invertita = il contrario di invertita scambia cursore con coda booleano isEmpty numeroTotaleElementi è zero? espandi array se necessario è necessario se numeroTotaleElementi vale quanto la dimensione di dati crea un nuovo array più grande se cursore - coda + 1 vale numeroTotaleElementi copia dati nel nuovo array più grande altrimenti copia la parte terminale di array nel nuovo array copia la parte iniziale di array nel nuovo array scambia array con l'array più grande intero cellaPrecedente indice se è invertita, restituisce indice + 1, altrimenti indice - 1 applica all'indice restituito la condizione di circolarità di un anello intero cellaSuccessiva indice se è invertita, restituisce indice - 1, altrimenti indice + 1 applica all'indice restituito la condizione di circolarità di un anello Codice:
push push push coda testa A[x][x][x][x][ ][ ][ ][ ][ ] reverse testa coda A[x][x][x][x][ ][ ][ ][ ][ ] push push push coda testa A[x][x][x][x][ ][ ][x][x][x] pop, pop coda testa A[x][x][x][x][ ][ ][ ][ ][x] reverse testa coda A[x][x][x][x][ ][ ][ ][ ][x] quattro push testa coda A[x][x][x][x][x][x][x][x][ ][ ][ ][ ][ ][ ][ ][x] |
![]() |
![]() |
![]() |
#27 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Supponendo di partire con array di otto elementi, dopo la seguente sequenza push push push push reverse push push push push ti trovi con l'array pieno e con gli estremi che ti toccano a meta' array. Come espandi l'array per il prossimo elemento ? Idealmente vorresti farlo "in mezzo" all'array, per aver spazio per i prossimi push. Non mi vienei n mente una soluzione semplice.
__________________
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 |
|
![]() |
![]() |
![]() |
#28 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Esattamente come hai detto, "lo apri in due come una mela". E' un anello lo espandi come tale.
La posizione del cursore ti dice dove stà "la metà" e dal suo rapporto con la coda e il numero totale degli elementi ricavi se il cursore abbia o non abbia fatto "un giro" e in che senso l'abbia fatto. Codice:
T H [X][X][X][X][X][X][X][X] se H è minore ti T da zero ad H va in testa e da T a length - 1 va in coda al nuovo. se H è maggiore di T e "l'array non ha fatto un giro" allora copy da T ad H inclusi nel nuovo array, a partire da zero o da T se vuoi lasciare inalterati gli indici della testa e della coda. |
![]() |
![]() |
![]() |
#29 |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Anzi, è più semplice:
gli elementi da zero al minore tra T ed H vengono copiati nelle posizioni da zero al minore tra T ed H nel nuovo array. gli elementi dal maggiore tra T ed H e la lunghezza dell'array vegono copiati da (lunghezza - Max(T, H)) a nuovoArray.length. Più o meno uno che è tardi e non ci ho voglia di contare tanto ![]() [Aggiunto] No, meglio quella di prima ![]() [Aggiunta all'aggiunto] Anzi, è meglio questo di adesso. Ok, vado a dormire ![]() Ultima modifica di PGI-Bis : 21-11-2006 alle 00:49. |
![]() |
![]() |
![]() |
#30 |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Hai ragione. Partivo dal presupposto che se devo ricopiare gli ultimi n elementi non ho piu' l'O(1), pero' in effetti quando espando un array nel caso generale devo comunque copiare i suoi elementi per cui in ogni caso ho l'O(n) ( o l'O(1) ammortizzato se preferisci )
__________________
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 |
![]() |
![]() |
![]() |
#31 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() allora tocca modificare così: oltre ai puntatori *A e *B aggiungiamo i due indici Left e Right: quando hanno un valore positivo indicano in *A, quando è negativo in *B. e sono 1-based e non possono mai essere 0. a questo punto:
Ultima modifica di 71104 : 21-11-2006 alle 11:20. |
|
![]() |
![]() |
![]() |
#32 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
a proposito:
Quote:
![]() |
|
![]() |
![]() |
![]() |
#33 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
E se lo facciamo circolare lo stack non è più semplice ?
Basta fare push in coda nel caso sia reversed... |
![]() |
![]() |
![]() |
#34 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
Per l'espansione me n'è venuta un'altra, ancora più facile. copia da array tutti gli elementi a partire da coda fino a cursore in array più grande a partire da zero. Poi imposta coda a zero, cursore a numero di elementi meno uno e invertita a false. |
|
![]() |
![]() |
![]() |
#35 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
![]() |
![]() |
![]() |
#36 | |
Senior Member
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
|
Quote:
|
|
![]() |
![]() |
![]() |
#37 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
#38 | |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#39 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:19.