Tavole dinamiche
This presentation is the property of its rightful owner.
Sponsored Links
1 / 27

Tavole dinamiche PowerPoint PPT Presentation


  • 87 Views
  • Uploaded on
  • Presentation posted in: General

Tavole dinamiche. Spesso non si sa a priori quanta memoria serve per memorizzare dei dati in un array , in una tavola hash , in un heap , ecc. Può capitare quindi di aver allocato una certa quantità di memoria per poi accorgersi, durante l’esecuzione del programma, che non ci basta.

Download Presentation

Tavole dinamiche

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Tavole dinamiche

Tavole dinamiche

Spesso non si sa a priori quanta memoria serve per memorizzare dei dati in un array, in una tavola hash, in un heap, ecc.

Pu capitare quindi di aver allocato una certa quantit di memoria per poi accorgersi, durante lesecuzione del programma, che non ci basta.

In tal caso bisogna allocare una memoria maggiore, ricopiare il contenuto della vecchia memoria nella nuova e rilasciare la vecchia memoria.


Tavole dinamiche

E anche opportuno, dopo aver rimosso molti elementi, ridurre la memoria allocando una memoria pi piccola in cui memorizzare gli elementi rimasti.

Vedremo come sia possibile aggiungere e togliere un elemento dalla tavola in tempo ammortizzato costante O(1)bench tali operazioni abbiano costo maggiore quando comportano espansione o riduzione della memoria.

Vedremo anche che questo si pu fare garantendo che la memoria inutilizzata sia sempre inferiore ad una frazione costante della memoria allocata.


Tavole dinamiche

Supporremo che una tavola T abbia i seguenti attributi:

  • un puntatore T.table alla memoria allocata.

  • due campi interi T.num e T.size, rispettivamente il numero di elementi presenti nella tavola e la dimensione della tavola.


Tavole dinamiche

Supporremo inoltre che sia possibile riservare e rilasciare memoria con le due operazioni:

Allocate(n) che riserva memoria per n elementi e restituisce un puntatore a tale memoria.

Free(p, n) che rilascia la memoria di dimensione npuntata da p.


Tavole dinamiche

Le operazioni da realizzare sono:

Table(T) che crea una nuova tavola vuota T.

Insert(T, x) che inserisce loggetto x nella tavola T.

Delete(T, x) che rimuove loggetto x dalla tavola T.


Tavole dinamiche

Non ci cureremo di come gli elementi siano organizzati nella memoria allocata o di altri dettagli implementativi ma ci limiteremo ad assumere che siano definite le tre operazioni:

Push(p, x) memorizza lelemento x nella

memoria puntata da p.

Pop(p, x) rimuove lelemento x dalla memoria

puntata da p.

Copy(q, p, n) ricopia n elementi dalla memoria

puntata da palla memoria puntata da q.


Tavole dinamiche

Espansione

Consideriamo dapprima il caso in cui vengono eseguite soltanto inserzioni di nuovi elementi e nessuna rimozione.

Definiamo come fattore di caricodella tavola il rapporto = num / size.

Quando = 1la tavola piena ed occorre espanderla allocando nuova memoria.

Una euristica comune raddoppiare la memoria, il che garantisce un fattore di carico > .


Tavole dinamiche

La definizione della funzione Table(T) che crea una tavola vuota :

Table(T)

T.size = 0

T.num = 0

T.table =nil

Essa richiede un tempo costante.


Tavole dinamiche

La definizione di Insert(x) :

Insert(T,x)

ifT.size == 0

T.table =Allocate(1)

T.size = 1

ifT.num == T.size

p = Allocate(2 T.size)

Copy(p, T.table, T.num)

Free(T.table, T.size)

T.table =p

T.size = 2 T.size

Push(T.table, x)

T.num =T.num + 1


Tavole dinamiche

Per lanalisi di Insertpossiamo assumere che le operazioni Allocate, Free e Pushrichiedano tempo costante e che Copy richieda tempo proporzionale al numero di elementi copiati.

Consideriamo il costo di una sequenza di nInsert eseguite a partire da una tavola vuota.

Il costo della k-esima Insert 1 se non vi espansione ed k se vi espansione:

k-1 per copiare i k-1 elementi precedenti pi 1 per le altre operazioni.


Tavole dinamiche

Siccome T.size sempre una potenza di 2e lespansione si ha quando T.num = k-1 uguale a T.size, il costo della k-esima Insert :

e il costo totale di nInsert:

Insert ha quindi costo ammortizzato:

O(3n)/n = O(1)


Tavole dinamiche

Il metodo degli accantonamenti mostra perch il costo ammortizzato 3.

  • una unit di costo viene spesa subito per linserimento dellelemento stesso.

  • una viene attribuita come credito allelemento stesso per pagare la sua successiva ricopiatura.

  • la terza viene attribuita come credito ad un altro elemento ricopiato prima e rimasto privo di credito.

Quindi, al momento dellespansione, ogni elemento ha una unit di costo per pagarsi la ricopiatura.


Tavole dinamiche

Possiamo anche usare il metodo del potenziale scegliendo una funzione potenziale che vale 0 allinizio e subito dopo una ricopiatura e che cresce fino alla dimensione della tavola tra una espansione e la successiva.

Una tale funzione :

Subito dopo la ricopiatura:

Quando la tavola piena:


Tavole dinamiche

num

32

size

2 num-size

16

8

4

2

1

i

1

2

4

8

16

32


Tavole dinamiche

Il costo ammortizzato di un inserimento senza espansione :

con espansione 1 = 2 (tavola vuota) e per k > 1


Tavole dinamiche

Espansione e contrazione

Delete(x) si realizza con una Pop(T.table, x) che rimuove lelemento x dalla tavola.

Ad evitare uno spreco eccessivo di memoria opportuno contrarre la tavola quando il fattore di carico = num / size diventa troppo piccolo.

Questo si fa allocando una memoria pi piccola, ricopiando i T.numelementi presenti nella tavola, e rilasciando la vecchia memoria.


Tavole dinamiche

La strategia ovvia dimezzare la memoria quando il fattore di carico diventa 1/2.

Questo ci assicura un fattore di carico > 1/2 anche in presenza di Delete.

Purtroppo, con questa strategia il costo ammortizzato delle operazioni non pi costante.


Tavole dinamiche

Consideriamo una successione costituita da 2kInsertseguite da 2k-2gruppi di quattro operazioni

Insert - Delete - Delete - Insert

per un totale di n = 2k+1operazioni.

In ogni gruppo la prima Insert comporta una espansione di costo 2k e la seconda Delete una contrazione di costo 2k.

Quindi ogni gruppo ha costo 2k+1

e in totale i 2k-2 gruppi hanno costo:

2k-2 2k+1 = n2/8 = (n2)

e il costo ammortizzato (n2)/n = (n).


Tavole dinamiche

Il problema che dopo una espansione (che porta ad 1/2 e consuma tutti i crediti) non si eseguono rimozioni sufficienti ad accumulare crediti per la successiva contrazione.

Occorre quindi aspettare che sia stata rimossa almeno una met degli elementi, ossia che diventi 1/4.


Tavole dinamiche

La definizione della funzione Delete(x) :

Delete(T, x)

ifT.num T.size/ 4

p = Allocate(T.size / 2)

Copy(p, T.table, T.num)

Free(T.table, T.size)

T.table =p

T.size = T.size/ 2

Pop(T.table, x)

T.num = T.num- 1


Tavole dinamiche

Usiamo il metodo del potenziale con una funzione potenziale che vale 0 sia allinizio che subito dopo una espansione o contrazione e che cresce fino a raggiungere il numero di elementi presenti nella tavola quando il fattore di carico aumenta fino ad 1 o diminuisce fino ad 1/4.

Una funzione di questo tipo


Tavole dinamiche

num

size

32

16

8

4

2

1

i

1

2

4

8

16

32

48


Tavole dinamiche

Se 1/2 il costo ammortizzato di un inserimento senza espansione :

con espansione; 1 = 2 (tavola vuota) e per k > 1:


Tavole dinamiche

Se < 1/2 non vi sicuramente espansione e il costo ammortizzato di un inserimento :


Tavole dinamiche

Se 1/2 il costo ammortizzato di una rimozione senza contrazione :

mentre con contrazione :


Tavole dinamiche

Se > 1/2 non vi sicuramente contrazione e il costo ammortizzato di una rimozione :


Tavole dinamiche

Esercizio 16

Assumere che la contrazione della tavola dinamica venga effettuata quando = 1/3 invece che quando = 1/4 e che invece di ridurre la sua dimensione ad 1/2 sizeessa venga ridotta a 2/3 size.

Calcolare il costo ammortizzato delle operazioni usando la funzione potenziale:

= |2num-size|


  • Login