• Non ci sono risultati.

Tipi di Dato Astratti e Concreti

N/A
N/A
Protected

Academic year: 2022

Condividi "Tipi di Dato Astratti e Concreti"

Copied!
37
0
0

Testo completo

(1)

Tipi di Dato Astratti e Concreti

Algoritmi e Strutture Dati

Luca Bortolussi

Email: lbortolussi@units.it

(2)

I Tipi di Dato

(3)

I Tipi di Dato

Sono “contenitori” di dati

Fissano le politiche di accesso Es.

I FirstIn First Out I Last In First Out

I Ad accesso casuale (Random Access)

(4)

Tipi di Dato Astratti e Concreti

Dobbiamo distinguere tra:

I Tipi di Dato Astratti (ADT):modelli che specificano:

I ildominiodei dati da memorizzare I leprimitivedi accesso

I in alcuni casi, definiscono come vengono memorizzati i dati I Tipi di Dato Concreti (CDT):implementanogli ADT e:

I codificano ogni primitiva di accesso

I possono fornire qualche funzionalit`a “fuori-specifica”

Due CDT possono implementare la stessa ADT in modi diversi

(5)

Tipi di Dato Astratti e Concreti

Dobbiamo distinguere tra:

I Tipi di Dato Astratti (ADT):modelli che specificano:

I ildominiodei dati da memorizzare I leprimitivedi accesso

I in alcuni casi, definiscono come vengono memorizzati i dati I Tipi di Dato Concreti (CDT):implementanogli ADT e:

I codificano ogni primitiva di accesso

I possono fornire qualche funzionalit`a “fuori-specifica”

Due CDT possono implementare la stessa ADT in modi diversi

(6)

Array

(7)

Array

Consentono l’accesso ai dati memorizzati tramiteindici

0 1 2 3 4 5 6 7 8 9

-4 0 1 2 5 6 7 11 12 13

Le primitive fornite sono:

I create(n) crea un array di dimensione n I get(i)restituisce il valore in posizione i I set(i, v) scrive il valore v in positione i I size()restituisce la dimensione dell’array

In Python sono implementati dalla classelist (!?!?!).

(8)

Array

Consentono l’accesso ai dati memorizzati tramiteindici

0 1 2 3 4 5 6 7 8 9

-4 0 1 2 5 6 7 11 12 13

Le primitive fornite sono:

I create(n) crea un array di dimensione n I get(i)restituisce il valore in posizione i I set(i, v) scrive il valore v in positione i I size()restituisce la dimensione dell’array

In Python sono implementati dalla classelist (!?!?!).

(9)

Array

Consentono l’accesso ai dati memorizzati tramiteindici

0 1 2 3 4 5 6 7 8 9

-4 0 1 2 5 6 7 11 12 13

Le primitive fornite sono:

I create(n) crea un array di dimensione n I get(i)restituisce il valore in posizione i I set(i, v) scrive il valore v in positione i I size()restituisce la dimensione dell’array

In Python sono implementati dalla classelist (!?!?!).

(10)

CDT in Python: Array

> > > A = [2 , -3 , 0 , 5] # A is [2 , -3 ,0 ,5]

> > > A [0] # the f i r s t i n d e x is 0 2

> > > A [ -1] # the l a s t i n d e x is -1

5 # the 2 nd l a s t is -2 , etc .

> > > A [1] = 7 # now A is [2 ,7 ,0 ,5]

> > > A

[2 , 7 , 0 , 5]

> > > len ( A ) # A s t o r e s 4 v a l u e s 4

(11)

Liste

(12)

Liste

Sono sequenze di valori che forniscono le seguenti funzionalit`a I create()crea una lista vuota

I head()restituisce il primo valore della lista

I tail()restituisce una “vista” alla lista priva del primo valore I prepend(v) aggiunge v in testa alla lista

I is empty()verifica se la lista `e vuota

(13)

Liste Concatenate

ADT derivate dalle liste

Propongono l’organizzazione dei dati:

I ogni valore `e contenuto in unnodo

I ogni nodo ha un riferimento al nodo successivo della lista

Head -4 next 0 next 1 next

La lista pu`o essere visitata dal primo elemento all’ultimo.

(14)

Liste Concatenate: Una Piccola Aggiunta

Pu`o essere vantaggioso, mantenere un riferimento all’ultimo nodo

Head -4 0 1

Last

next next next

Senza dover scandire la lista, possiamo implementare I last()restutuisce il valore in fondo alla lista I append(v) aggiunge v in fondo alla lista I extend(L) accoda la lista L

(15)

Liste Doppiamente Concatenate

Sono ADT derivate dalle liste

I nodi hanno anche un riferimento alpredecessore

-4 0 1

Head End

next next

next

prev prev prev

Possono essere visitate anche dalla fine alla testa Senza scandire la lista, implementano anche:

I delete last() cancella il valore in ultima posizione

(16)

Liste vs Array

Le liste sono ADTdinamiche:

I il numero di valori che memorizzano pu`o variare nel tempo I non dobbiamo specificare il numero valori contenuti in fase di

creazione

Gli array invece sono ADTstatiche: I hanno una dimensione fissata

I durante la creazione dobbiamo dire quanti oggetti contengono

Ma consentono l’indicizzazione senza scansione che `e comoda. . .

(17)

Liste vs Array

Le liste sono ADTdinamiche:

I il numero di valori che memorizzano pu`o variare nel tempo I non dobbiamo specificare il numero valori contenuti in fase di

creazione

Gli array invece sono ADTstatiche:

I hanno una dimensione fissata

I durante la creazione dobbiamo dire quanti oggetti contengono

Ma consentono l’indicizzazione senza scansione che `e comoda. . .

(18)

Possiamo “Simulare” la Liste con gli Array?

Dobbiamo conoscere ladimensione massima della lista

Poi potremmo . . .

I memorizzare i valori in ordine dal primo indice I tenere traccia della dimensione

1 2 3 4 5 6 7 8 9 10

-4 0 1 2 5 4 0 -2 1 7

Head

Size

Ottimo perappend(v) e delete last(), ma. . .tail()e prepend(v)?

(19)

Possiamo “Simulare” la Liste con gli Array?

Dobbiamo conoscere ladimensione massima della lista

Poi potremmo . . .

I memorizzare i valori in ordine dal primo indice I tenere traccia della dimensione

1 2 3 4 5 6 7 8 9 10

-4 0 1 2 5 4 0 -2 1 7

Head

Size

Ottimo perappend(v) e delete last(), ma. . .tail()e prepend(v)?

(20)

Possiamo “Simulare” la Liste con gli Array?

Dobbiamo conoscere ladimensione massima della lista

Poi potremmo . . .

I memorizzare i valori in ordine dall’ultimo indice I tenere traccia della dimensione

1 2 3 4 5 6 7 8 9 10

5 3 -2 7 0 -4 0 1 2 5 Last

Size

Ok pertail()e prepend(v), ma . . .append(v) e delete last()?

(21)

Possiamo “Simulare” la Liste con gli Array?

Dobbiamo conoscere ladimensione massima della lista

Poi potremmo . . .

I memorizzare i valori in ordine dall’ultimo indice I tenere traccia della dimensione

1 2 3 4 5 6 7 8 9 10

5 3 -2 7 0 -4 0 1 2 5 Last

Size

Ok pertail()e prepend(v), ma . . .append(v) e delete last()?

(22)

Array Circolari

(23)

Gli Array Circolari

Rappresentano liste usando array memorizzando:

I la dimensione della lista

I l’indice del primo elemento della lista

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size

Per aggiungere in alla lista:

I inseriamo il valore in posizione (Head)%max size = I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(24)

Gli Array Circolari

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size Per aggiungere −2 in fondo alla lista:

I inseriamo il valore in posizione (Head+Size)%max size = 0 I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(25)

Gli Array Circolari

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size Per aggiungere −2 in fondo alla lista:

I inseriamo il valore in posizione (Head+Size)%max size = 0 I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(26)

Gli Array Circolari

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size Per aggiungere 7 in fondo alla lista:

I inseriamo il valore in posizione (Head+Size)%max size = 1 I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(27)

Gli Array Circolari

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size Per aggiungere 7 in fondo alla lista:

I inseriamo il valore in posizione (Head+Size)%max size = 1 I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(28)

Gli Array Circolari

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size Per aggiungere 6 in testa alla lista:

I inseriamo il valore in posizione (Head-1)%max size = 4 I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(29)

Gli Array Circolari

1 2 3 4 5 6 7 8 10

5 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 3 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 0 -4 0 1 2 5

1 2 3 4 5 6 7 8 10

-2 7 -2 7 6 -4 0 1 2 5

Head

Size Size Size Per aggiungere 6 in testa alla lista:

I inseriamo il valore in posizione (Head-1)%max size = 4 I incrementiamo di 1 la dimensione della lista

I riassegnamo l’indice della testa

(30)

Pile

(31)

Pile (Stack)

ADT che usano la politicaFirstInLast Out:

I push(v) inserisce il valore v in cima alla pila

I pop() rimuove il valore in cima alla pila e lo restituisce I top() restituisce il valore in cima alla pila senza rimuoverlo

dalla stessa

I is empty()restituisce true se e solo se la pila `e vuota

(32)

Pile (Stack)

Come implementare le code?

Con le liste !?!?!?! I Liste Concatenate

I Array (non servono nemmeno quelli circolari!?!?!)

push(v)=append(v) e pop()=last()+ delete last()

(33)

Pile (Stack)

Come implementare le code? Con le liste !?!?!?!

I Liste Concatenate

I Array (non servono nemmeno quelli circolari!?!?!)

push(v)=append(v) e pop()=last()+ delete last()

(34)

Code

(35)

Code (Queue)

ADT che usano la politicaFirstInFirstOut:

I enqueue(v) inserisce il valore v nella coda

I dequeue() rimuove dalla coda il valore che ci sta da pi`u tempo

I head()restituisce il valore in testa alla coda senza rimuoverlo dalla stessa

I is empty()restituisce true se e solo se la coda `e vuota

(36)

Code (Queue)

Come implementare le code?

Con le liste !?!?!?! I Liste Doppiamente Concatenate

I Array Circolari

enqueue(v)=append(v) e dequeue()≈ head()+tail()

(37)

Code (Queue)

Come implementare le code? Con le liste !?!?!?!

I Liste Doppiamente Concatenate I Array Circolari

enqueue(v)=append(v) e dequeue()≈ head()+tail()

Riferimenti

Documenti correlati

initiative, while retaining some leverage for Germany in the long run, and continuing to exercise influence while supporting PESCO as the main framework for security cooperation

In 2016 the European Commission published its Road Transport Strategy for Europe, and the Florence Road Forum brought together the most relevant stakeholders and experts to

Walter Mocchi e la costruzione di un’industria operistica fra Italia e Sud

“Eppure il satellite prima e la rete poi, in quanto ambienti in grado di sviluppare spazi di comunicazione transnazionale, hanno non solo ampliato in maniera

In 2014 China became also a net foreign investor, after years of being one of the leading recipients of FDI. The country is an international lender and perhaps the only one

hosp_other_cum Equal to 1 if the person ever had a hospitalisation for other diseases until ¯ t-1 days_other_cum Number of days spent in hospitals for other type of diseases until ¯

The Migration Policy Centre at the European University Institute, Florence, conducts advanced research on global migration to serve migration governance needs at European level,

En pratique, il faut signaler que le rapatriement dans son pays est exercé, à titre d’exemple, le 16 décembre 2003, 300 Irakiens détenus à la prison de Roumieh sont rapatriés en