algoritmi e calcolo parallelo 2012/2013 - strutture dati elementari

25
Prof. Pier Luca Lanzi Strutture Dati Elementari Algoritmi e Calcolo Parallelo

Upload: pier-luca-lanzi

Post on 18-Dec-2014

436 views

Category:

Education


3 download

DESCRIPTION

Slide del corso di Algoritmi e Calcolo Parallelo per il corso di laurea magistrale in Ingegneria Matematica 2012/2013 - Politecnico di Milano

TRANSCRIPT

Page 1: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Strutture Dati ElementariAlgoritmi e Calcolo Parallelo

Page 2: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Riferimenti

• Bertossi Alan A., Montresor Alberto. “Algoritmi e strutture di dati” (seconda edizione), CittàStudi 2010

• Stanley B. Lippman, Barbara E. Moo, Josee Lajoie“C++ Primer”, 5th Edition Addison-Wesley

2

Page 3: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Tipo di Dato Astratto

• Dato In un linguaggio di programmazione, un dato è

un valore che una variabile può assumere

• Tipo di dato astrattoUn modello matematico, dato da una collezione

di valori e un insieme di operazioni ammesse su questi valori

• Tipi di dati primitiviForniti direttamente dal linguaggioEsempi: int (+,-,*,/, %), boolean (!, &&, ||)

3

Page 4: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste

• Liste (List, Linked List)Una sequenza di nodi, contenenti dati arbitrari e

1-2 puntatori all'elemento successivo e/o precedente

La contiguità nella lista non implica la contiguità in memoria

• Costo operazioniTutte le operazioni hanno costo O(1)

• Realizzazione possibiliBidirezionale/MonodirezionaleCon sentinella/Senza sentinellaCircolare /Non circolare

4

Page 5: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Esempi di Linked Liste 5

Page 6: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste puntate (Linked List)

• Sequenza di nodi, contenenti dati (qualsiasi) arbitrari e 1-2 reference (puntatori, link) all'elemento successivo e/o precedente

• Liste puntate semplici

• Liste puntate doppie

• Liste circolari

6

Page 7: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste Puntate Semplici (Linked List)

7

Page 8: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste Puntate Semplici (Linked List)

Inserimento Cancellazione

8

Page 9: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste Puntate Semplici e Doppie (Linked List)

LIST-SEARCH(L, k)1 x ← head[L]2 while (x ≠ NIL && key[x] ≠ k)3 do x ← next[x]4 return x

Ricerca Inserimento in testa

LIST-INSERT(L, x)1 next[x] ← head[L]2 if head[L] ≠ NIL3 prev[head[L]] ← x4 head[L] ← x5 prev[x] ← NIL

9

Page 10: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

List - Circolare, Bidirezionale, con Sentinella

10

Page 11: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste nella STL C++

• Sono implementate come liste bidirezionali

• Vantaggi Inserimento e cancellazione di un elemento sono efficienti

(Θ(1)) Spostamento di elementi nella stessa lista o fra liste è

efficiente (Θ(1)) L’iterazione sugli elementi della lista nelle due direzioni è

efficiente (Θ(n))

• Svantaggi Non permettono l’accesso diretto agli elementi della

struttura (e.g. A[i]) Ad esempio, per accedere all’elemento i di una lista

bisogna scorrerla dall’inizio fino all’elemento cercato (Θ(n))

Richiedono la memorizzazione dei collegamenti fra elementi(maggiore memoria rispetto ai vettori)

• Riferimenti http://www.cplusplus.com/reference/stl/list/

11

Page 12: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste nella STL C++

• Iteratori: begin(), end(), rbegin(), rend()

• Capacità: empty, size, max_size, resize

• Accesso agli elementi: front, back

• Modificatori: push_front, pop_front, push_back, pop_back, insert, erase, swap, clear

• Operazioni: splice, remove, remove_if, unique, merge, sort, reverse

12

Page 13: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste – Implementazione con Vettori

• E’ possibile realizzare una lista con vettori La posizione equivale all’indice nel vettore Le operazioni insert e remove hanno costo O(n) Tutte le altre operazioni hanno costo O(1)

• Problema Spesso non si conosce a priori quanta memoria serve per

memorizzare la lista Se ne alloca una certa quantità, per poi accorgersi che non è

sufficiente.

• Soluzione Si alloca un vettore di dimensione maggiore, si ricopia il

contenuto del vecchio vettore nel nuovo e si rilascia il vecchio vettore

13

Page 14: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Liste – Implementazione con Vettori(Espansione/Contrazione)• Espansione (due approcci)

Raddoppiare la capienza del vettore Incrementare il vettore di un fattore costante

• Contrazione E’ opportuno contrarre il vettore quando il fattore di

carico α = size/capacity diventa troppo piccolo size è il numero di elementi attualmente presenti capacity è la dimensione del vettore L’operazione richiede l’allocazione, la copia, e la

deallocazione

14

Page 15: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Pile/Stack

• Insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è predeterminato: “quello che per meno tempo è rimasto nell’insieme”

• Politica “last in, first out” (LIFO)

• Operazioni previste (tutte realizzabili in O(1))

20

Page 16: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Stack (o Pila)

• Una pila o stack è un insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è predeterminato: “quello che per meno tempo è rimasto nell’insieme” politica “last in, first out” (LIFO)

• Operazioni previste void push(Item) // inserisce un elemento Item pop() // rimuove l‘elemento

// in cima Item top() // legge l’item in cima

// non rimuove l'item boolean isEmpty() // true se la pila è vuota

21

Page 17: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Applicazione e Implementazione

• Possibili utilizzi Nei linguaggi con procedure:

gestione dei record di attivazione Nei linguaggi stack-oriented: le

operazioni elementari prendono uno-due operandi dallo stack e inseriscono il risultato nello stack

Notazione RPN: 3 4 + 7 -

• Possibili implementazioni Tramite liste bidirezionali

(puntatore all'elemento top) Tramite vettore

(dimensione limitata, overhead più basso)

22

top

Page 18: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Stack (Pseudocodice) 23

Page 19: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Stack nella STL C++

• Funzioniemptysize toppushPop

• Esempihttp://ideone.com/QUyf6https://ideone.com/zh4ho

24

Page 20: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Code/Queue

• Insieme dinamico in cui l’elemento rimosso dall’operazione di cancellazione è predeterminato: “quello che per più tempo è rimasto nell’insieme”

• Politica di gestione “first in, first out” (FIFO)

• Operazione previste O(1)

25

Page 21: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Code/Queue

• ApplicazioniNei sistemi operativi, i processi in attesa di

utilizzare una risorsa vengono gestiti tramite una coda FIFO

Visita dei grafi

• ImplementazioniListe monodirezionali: puntatore head (inizio

della coda), per estrazione; puntatore tail (fine della coda), per inserimento

Array circolari: dimensione limitata, overhead più basso

26

Page 22: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Coda/Queue – Implementazione con Vettori Circolari

• La “finestra” dell’array occupata dalla coda si sposta lungo l’array!

• Dettagli implementativiL'array circolare può

essere implementato con un'operazione di modulo

Bisogna prestare attenzioneai problemi di overflow(buffer pieno)

27

head+n

3

654

43

head

3 6 54 43

head

head+n

Page 23: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Coda/Queue – Implementazione con Vettori Circolari

28

head

3 6 54 43

head+n

3 6 54 43 12

6 54 43 12

head+n

head head+n

head

enqueue(12)

dequeue() → 3

6 54 43 12

head+n

head

15 1733

enqueue (15, 17, 33)

Page 24: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Coda/Queue - Pseudocodice 29

Page 25: Algoritmi e Calcolo Parallelo 2012/2013 - Strutture Dati Elementari

Prof. Pier Luca Lanzi

Code/Queue nella STL C++

• Funzioniemptysize front: accesso al prossimo elemento della codaback: accesso all’ultimo elementopush: inserisce un elemento in codapop: cancella il prossimo elemento

• Costuttoretemplate < class T, class Container = deque<T> > class queue;

30