algoritmi e strutture di dati - roma tre university

21
046-tipi-astratti-di-dato-02 1 046-tipi-astratti-di-dato-02 copyright ©2015 [email protected] algoritmi e strutture di dati tipi astratti di dato (pile, code, liste implementate tramite array) m.patrignani 046-tipi-astratti-di-dato-02 copyright ©2015 [email protected] nota di copyright queste slides sono protette dalle leggi sul copyright il titolo ed il copyright relativi alle slides (inclusi, ma non limitatamente, immagini, foto, animazioni, video, audio, musica e testo) sono di proprietà degli autori indicati sulla prima pagina le slides possono essere riprodotte ed utilizzate liberamente, non a fini di lucro, da università e scuole pubbliche e da istituti pubblici di ricerca ogni altro uso o riproduzione è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori gli autori non si assumono nessuna responsabilità per il contenuto delle slides, che sono comunque soggette a cambiamento questa nota di copyright non deve essere mai rimossa e deve essere riportata anche in casi di uso parziale

Upload: others

Post on 30-May-2022

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

1

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

algoritmi e strutture di datitipi astratti di dato

(pile, code, liste implementate tramite array)

m.patrignani

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

nota di copyright• queste slides sono protette dalle leggi sul copyright • il titolo ed il copyright relativi alle slides (inclusi, ma non

limitatamente, immagini, foto, animazioni, video, audio, musica e testo) sono di proprietà degli autori indicati sulla prima pagina

• le slides possono essere riprodotte ed utilizzate liberamente, non a fini di lucro, da università e scuole pubbliche e da istituti pubblici di ricerca

• ogni altro uso o riproduzione è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori

• gli autori non si assumono nessuna responsabilità per il contenuto delle slides, che sono comunque soggette a cambiamento

• questa nota di copyright non deve essere mai rimossa e deve essere riportata anche in casi di uso parziale

Page 2: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

2

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

sommario• tipi astratti di dato• strutture di dati elementari

– le pile– le code– le liste

• implementazione con array di queste strutture

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

tipo astratto di dato• un tipo astratto di dato (o ADT, abstract data

type) è una descrizione di un tipo di dato indipendente dalla sua realizzazione in un linguaggio di programmazione

• un tipo astratto di dato è costituito da:– i domini interessati

• tra cui il dominio di interesse ed eventualmente altri domini di supporto

– un insieme di costanti– una collezione di operazioni

Page 3: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

3

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

esempio di tipo astratto di dato• insieme di interi

– domini• il dominio di interesse è l’insieme I degli insiemi di interi• dominio di supporto: gli interi Z = {0, 1, -1, 2, -1, …}• dominio di supporto: i booleani B = {true, false}

– costanti• l’insieme vuoto {} è una costante del dominio I

– operazioni• verifica se un insieme è vuoto

IS-EMPTY: I → B• aggiunta di un elemento ad un insieme

ADD: I × Z → I• verifica se un elemento appartiene all’insieme

SEARCH: I × Z → B• ecc.

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

il tipo astratto di dato pila• le pile (o stack) realizzano una strategia LIFO

(last-in first-out) • tipo astratto: pila di interi

– domini• il dominio di interesse è l’insieme delle pile P di interi• dominio di supporto: gli interi Z = {0, 1, -1, 2, -1, …}• dominio di supporto: i booleani B = {true, false}

– costanti• la pila vuota

Page 4: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

4

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

il tipo astratto di dato pila• tipo astratto: pila di interi

– operazioni• verifica se una pila è vuota

IS-EMPTY: P → B• inserimento di un elemento nella pila

PUSH: P × Z → P• rimozione e restituzione dell’elemento affiorante della pila

POP: P → P × Z– operazioni aggiuntive

• lettura dell’elemento affiorante della pilaTOP: P → Z

• svuotamento della pilaEMPTY: P → P

• numero degli elementi nella pilaSIZE: P → Z

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

realizzazione di un tipo astratto di dato• un tipo astratto di dato può essere realizzato (o

implementato) in uno specifico linguaggio di programmazione tramite la definizione di– tipi concreti o strutture dati nello specifico

linguaggio di programmazione corrispondenti ai domini necessari

– costrutti che consentono di codificare le costanti– funzioni che realizzano le operazioni previste

• ovviamente uno stesso tipo astratto di dato può avere diverse realizzazioni con diverse proprità

Page 5: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

5

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

realizzazione di un ADT: osservazioni• la definizione dei tipi concreti o delle strutture che

corrispondono ai domini può comportare delle limitazioni– esempi di limitazioni

• il dominio P delle pile viene ristretto alle pile di dimensione massima maxsize, nota a priori

• il dominio Z degli interi viene realizzato tramite il tipo concreto intche ha un valore minimo MININT e massimo MAXINT

• le costanti vengono spesso codificate tramite delle funzioni che ritornano la struttura corrispondente– esempio di costante:

• la pila vuota viene realizzata tramiteCREATE-STACK(maxsize)

che ritorna il riferimento ad una pila vuota che potrà contenere al massimo maxsize elementi

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

funzioni che operano su pile• CREATE-STACK(maxsize)

– ritorna il riferimento ad una pila vuota che potrà contenere al massimo maxsize elementi

• IS-EMPTY(p)– ritorna true se la pila è vuota, false altrimenti

• PUSH(p,x)– inserimento di un elemento nella pila

• può dare un errore di “overflow” se l’implementazione prevede un numero massimo di elementi nella pila

• POP(p)– rimozione e restituzione dell’elemento affiorante della pila

• dà un errore di “underflow” se la pila è vuota

Page 6: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

6

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

altre funzioni su pile• TOP(p)

– ritorna l’elemento affiorante senza rimuoverlo• può dare errore se la pila è vuota

• EMPTY(p)– svuota la pila

• SIZE(p)– ritorna il numero degli elementi in pila

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

realizzazione del dominio pila• una pila p può essere implementata con un oggetto

contenente un array A e un attributo P.top che contiene l’indice dell’elemento affiorante

4 7 1 2

• quando la pila è vuota p.top vale -1

-1

p.top

3

p.top

p.A

p.A

Page 7: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

7

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

PUSH(p,9)

sequenza di operazioni su una pilap.top

-1

3p.top

0

3 1p.top

1

3 1 4 9p.top

2

PUSH(p,3)

PUSH(p,1)

POP(p)

PUSH(p,4)

3 1 4 9p.top

3

3 1 4 9p.top

1

POP(p)

p.A

p.A

p.Ap.A

p.A

p.A

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

operazione CREATE-STACK• implementazione in pseudocodice della

funzione di creazione

4. return p

3. p.top = –1

2. p.top intero

1. creo un oggetto p con: p.A array di 100 interi

CREATE-STACK()

Page 8: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

8

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

operazioni PUSH e POP• implementazione in pseudocodice delle

funzioni di modifica

4. return p.A[p.top + 1]

3. else p.top = p.top – 1

2. then error(“underflow”)

1. if p.top == -1

POP(p)

4. p.A[p.top] = x

3. else p.top = p.top + 1

2. then error(“overflow”)

1. if p.top == p.A.length-1

PUSH(p,x)

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

altre operazioni sulle pile

1. return p.top == -1 true se la pila è vuota

IS-EMPTY(p)

1. p.top = -1 vuoto la pila

EMPTY(p)

1. return p.A[p.top] l’elemento affiorante

TOP(p)

• il tempo di esecuzione di ogni operazione è Θ(1)

1. return p.top + 1 il numero di elementi

SIZE(p)

Page 9: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

9

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

uso delle realizzazioni di un ADT• dopo aver realizzato un ADT possiamo mettere

l’implementazione a disposizione dei programmatori specificando– le eventuali limitazioni della realizzazione– l’elenco delle operazioni supportate e la loro complessità

asintotica• esempio

– si dispone di una realizzazione di una pila con le seguenti funzioni e complessità nel caso peggiore• CREATE-STACK(maxsize) Θ(1)• IS-EMPTY(p) Θ(1)• PUSH(p,x) Θ(1)• POP(p) Θ(1)• EMPTY(p) Θ(1)

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

il tipo astratto di dato coda• le code (o queue) realizzano una strategia FIFO

(first-in first-out) • tipo astratto: coda di interi

– domini• il dominio di interesse è l’insieme delle code Q di interi• dominio di supporto: gli interi Z = {0, 1, -1, 2, -1, …}• dominio di supporto: i booleani B = {true, false}

– costanti• la coda vuota

Page 10: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

10

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

il tipo astratto di dato coda• tipo astratto: coda di interi

– operazioni• verifica se una coda è vuota

IS-EMPTY: Q → B• inserimento di un elemento nella coda

ENQUEUE: Q × Z → Q• rimozione e restituzione dell’elemento più vecchio della coda

DEQUEUE: Q → Q × Z– operazioni aggiuntive

• lettura dell’elemento più vecchio della codaFRONT: Q → Z

• svuotamento della codaEMPTY: Q → Q

• numero degli elementi nella codaSIZE: Q → Z

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

realizzazione dell’ADT coda• CREATE-QUEUE(maxsize)

– ritorna un riferimento ad una coda vuota che può contenere al massimo maxsize interi

• IS-EMPTY(c)– ritorna true se la coda è vuota, altrimenti ritorna false

• ENQUEUE(c,x)– inserisce un elemento x nella coda

• può dare un errore di “overflow” se l’implementazione prevede un numero massimo di elementi

• DEQUEUE(c)– rimuove l’elemento più vecchio della coda e lo restituisce

• dà un errore di “underflow” se la coda è vuota

Page 11: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

11

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

altre operazioni su code• FRONT(c)

– ritorna l’elemento più vecchio senza rimuoverlo• può dare errore se la coda è vuota

• EMPTY(c)– svuota la coda

• SIZE(c)– ritorna il numero degli elementi in coda

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

implementazione di una coda• una coda c può essere realizzata con un array c.A

arricchito da due attributi c.head e c.tail che contengono gli indici dell’elemento più vecchio e della prima posizione utile

4 7 1 2

• un nuovo elemento viene aggiunto da ENQUEUE nella posizione c.tail (che viene incrementato)

c.tail

4c.head

0

4 7 1 2 7c.tail

5c.head

0

c.A

c.A

Page 12: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

12

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

implementazione di una coda• l’elemento ritornato da DEQUEUE è quello in

posizione c.head (che viene incrementato)

4 7 1 2

• l’array è gestito come una lista circolare

c.tail

4c.head

0

5 7 1 2 4 3 6 2c.tail

1c.head

4

4 7 1 2c.tail

4c.head

1

c.A

c.A

c.A

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

implementazione di una coda• la coda è vuota quando c.head e c.tail puntano

alla stessa casella

• la coda non può avere più di n-1 elementi– se avesse n elementi, che valore potremmo dare a c.tail

senza creare equivoco con la coda vuota?

c.tail

c.head

4 6 1 7 3 6 2c.tail

c.head

c.A

c.A

5 5

4 3

Page 13: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

13

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

operazioni ENQUEUE e DEQUEUE

6. else c.tail = c.tail + 1

5. c.tail = 0

4. if c.tail == c.A.length-1

3. else c.A[c.tail] = x

2. error(“overflow”)

1. if c.head==c.tail+1 or (c.tail==c.A.length-1 and c.head==0)

ENQUEUE(c,x)

7. return x

6. else c.head = c.head + 1

5. c.head = 0

4. if c.head == c.A.length-1

3. else x = c.A[c.head]

2. error(“underflow”)

1. if c.head == c.tail

DEQUEUE(c)

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

altre operazioni sulle code

1. return c.head == c.tail

IS-EMPTY(c)

1. c.head = c.tail = 0

EMPTY(c)

3. else return c.A[c.head]

2. then error(“empty queue”)

1. if c.head == c.tail

FRONT(c)

• il tempo di esecuzione di ogni operazione è Θ(1)

Page 14: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

14

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

esercizi su pile e code1. scrivi lo pseudocodice della procedura CREATE-

QUEUE() che restituisce il riferimento ad una coda vuota

2. scrivi lo pseudocodice della procedura SIZE(c) che restituisce il numero di elementi in una coda

3. scrivi lo pseudocodice che implementa una struttura dati in cui si possa inserire/rimuovere elementi sia in testa che in coda– deve avere contemporaneamente PUSH, POP, DEQUEUE,

ENQUEUE (dove evidentemente ENQUEUE è uguale a PUSH)

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

esercizi su pile e code5. descrivi come sia possibile implementare un coda disponendo

solo della realizzazione di una pila– ti occorreranno due pile p1 e p2 da usare simultaneamente– le operazioni ENQUEUE e DEQUEUE si tradurranno in opportune

operazioni di PUSH e POP sulle due pile p1 e p2– discuti la complessità delle operazioni ENQUEUE e DEQUEUE

6. descrivi come sia possibile implementare una pila disponendo solo della realizzazione di una coda

– discuti la complessità delle operazioni PUSH e POP7. scrivi lo pseudocodice della procedura CONTAINS(p,x)

che ritorna true se l’elemento x è contenuto nella pila p e ritorna false se x non è contenuto (lasciando la pila invariata)

Page 15: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

15

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

liste• le liste sono strutture di dati in cui gli oggetti sono

disposti in una sequenza lineare– occorre poter scorrere la lista con un iteratore, cioè un indice

di posizione

• tipo astratto: lista di interi– domini

• il dominio di interesse è l’insieme delle liste L di interi• dominio di supporto: gli iteratori I che identificano le posizioni• dominio di supporto: gli interi Z = {0, 1, -1, 2, -1, …}• dominio di supporto: i booleani B = {true, false}

– costanti• la lista vuota

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

operazioni dell’ADT lista• operazioni sulle liste di interi

– ritorna l’iteratore del 1° elemento: HEAD: L → I– ritorna l’iteratore dell’ultimo: LAST: L → I– ritorna l’iteratore dell’elemento seguente: NEXT: L × I → I– ritorna l’iteratore dell’ elemento precedente: PREV: L × I → I– ritorna l’intero nella posizione specificata: INFO: L × I → Z– verifica se una lista è vuota: IS-EMPTY: L → B– inserisce in testa alla lista: INSERT: L × Z → L– inserisce prima di una posizione: INSERT-BEFORE: L × I × Z → L– inserisce in coda: ADD: L × Z → L– inserisce dopo una posizione: ADD-AFTER: L × I × Z → L– cerca la posizione di un elemento: SEARCH: L × Z → I– elimina un elemento: DELETE: L × I → L– cerca ed elimina un elemento: DELETE: L × Z → L– svuota la lista: EMPTY: L → L– numero degli elementi: SIZE: L → Z

Page 16: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

16

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

realizzazione di una lista• creazione

CREATE-LIST(maxsize)• ritorna il riferimento ad una lista vuota che può contenere al massimo maxsize elementi

• operazioni di aggiornamentoINSERT(l,x)

• inserisce l’elemento x in testa alla lista lINSERT-BEFORE(l,x,i)

• inserisce l’elemento x prima della posizione iADD(l,x)

• aggiunge x in coda alla lista lADD-AFTER(l,x,i)

• aggiunge l’elemento x dopo la posizione iDELETE(l,i)

• rimuove l’elemento in posizione i dalla lista lEMPTY(l)

• vuota la lista

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

operazioni possibili sulle liste• operazioni di consultazione

NEXT(l,i)• ritorna l’iteratore dell’elemento che segue i nella lista• dà errore (o ritorna un iteratore invalido) se i è l’ultimo elemento

PREV(l,i)• ritorna l’interatore dell’elemento che precede i nella lista• dà errore (o ritorna un iteratore invalido) se i è il primo elemento

HEAD(l)• ritorna l’iteratore del primo elemento della lista

LAST(l)• ritorna l’iteratore dell’ultimo elemento della lista

SEARCH(l,k)• ritorna l’iteratore dell’elemento con chiave k nella lista l

IS-EMPTY(l)• ritorna true se la lista è vuota, altrimenti ritorna false

Page 17: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

17

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

realizzazione di una lista con un array• un elemento xi della lista

corrisponde ad un indice idei tre array

• l.next[i] contiene l’indice dell’elemento che segue xi

• l.prev[i] contiene l’indice dell’elemento che precede xi

• se l.next[i] o l.prev[i] è-1, xi è l’ultimo o il primo elemento della lista

2 3 5

3 -1 1

l.head 6

l.next

3 5 2l.key

6 1 -1l.prev

sequenza: , ,

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

più liste con gli stessi array• gli array l.next, l.keyed l.prevpossono essere condivisi da due o più liste– le liste non

interferiscono, perché utilizzano posizioni diverse degli array

3-1-1 2 1

l2.head 5

l1.next = l2.next

3 7 5 4 2l1.key = l2.key

6 5 1 -1-1l1.prev = l2.prev

l1.head 6

2 3 5sequenza 1: , ,4 7sequenza 2: ,

Page 18: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

18

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

uso della lista libera• per inserire un nuovo elemento

in lista occorre sapere quali posizioni degli array sono ancora libere

• tutte le posizioni libere possono essere memorizzate in una seconda lista l.free– un inserimento di un elemento in l è un trasferimento di una posizione dalla lista l.freealla lista l.head

– una cancellazione da l è un trasferimento di una posizione dalla lista l.head alla lista l.free

4 3 0-17 2 1-1

l.free 5

l.next

3 5 2l.key

2 6 5 1 0-1-14l.prev

l.head 6

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

configurazione iniziale: lista vuota• quando la lista l è vuota tutte le posizioni sono

assegnate alla lista l.free

1 2 3 4 5 6 7-1

l.free 0

l.next

l.key

-10 1 2 3 4 5 6l.prev

l.head -1

-12 3 4 5 6 7-1

l.free 1

l.next

4l.key

-1-11 2 3 4 5 6l.prev

l.head 0inserimento del primo elemento

Page 19: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

19

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

creazione di una lista vuota di interi• procedura per inizializzare una lista vuota di

interi (supponendo al massimo 100 posizioni)

10. return l

9. l.free = 0

8. l.head = -1

7. l.next[99] = -1

6. l.prev[i] = i-1

5. l.next[i] = i+1

4. for i = 0 to 99

3. l.head, l.free interi

2. l.next, l.key, l.prev array di 100 interi

1. creo un nuovo oggetto l con:

CREATE-LIST()

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

gestione della lista l.free• procedura di servizio per ottenere una posizione

libera dalla lista l.free

8. return i

7. l.prev[l.free] = -1

6. if l.free != -1

5. l.free = l.next[l.free]

4. i = l.free i è l’indice della nuova posizione

3. else

2. error(“overflow”)

1. if l.free == -1

ALLOCATE-COLUMN(l)

Page 20: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

20

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

gestione della lista l.free• procedura di servizio per restituire una

posizione alla lista l.free

5. l.free = i

4. l.prev[l.free] = i

3. if l.free != -1

2. l.next[i] = l.free

1. l.prev[i] = -1

FREE-COLUMN(l,i)

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

codice di INSERT(L,x)

7. l.head = i

6. l.prev[l.head] = i

5. if l.head != -1

4. l.next[i] = l.head il resto della lista segue i

3. l.prev[i] = -1 i diventa primo elemento

2. l.key[i] = x

1. i = ALLOCATE-COLUMN(l) indice di una nuova colonna libera

INSERT(l,x) x è il valore da aggiungere in lista

3 -1 1

l.head 6

l.next

3 5 2l.key

6 1 -1l.prev

i

3 -1 1 6

l.head 7

l.next

3 5 2 xl.key

6 1 7-1l.prev

7

Page 21: algoritmi e strutture di dati - Roma Tre University

046-tipi-astratti-di-dato-02

21

046-tipi-astratti-di-dato-02 copyright ©2015 [email protected]

esercizi: liste implementate con array1. scrivi lo pseudocodice della procedura

DELETE(l,i) che rimuove da l l’elemento in posizione i

2. scrivi lo pseudocodice della procedura SEARCH(l,k) che restituisce la posizione del primo elemento di l con valore della chiave k

3. scrivi lo pseudocodice della procedura SIZE(l) che conta gli elementi della lista l