La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Strutture dati elementari Pile Code Liste concatenate Alberi medianti puntatori.

Presentazioni simili


Presentazione sul tema: "Strutture dati elementari Pile Code Liste concatenate Alberi medianti puntatori."— Transcript della presentazione:

1 Strutture dati elementari Pile Code Liste concatenate Alberi medianti puntatori

2 Pile (Stacks) Cè una politica LIFO (last-in, first-out), ossia lelemento rimosso dalla pila è quello che è stato più recentemente inserito Operazioni: –PUSH(S,x) (inserisci) –POP(S) (elimina,rimuovi) –STACK-EMPTY(S) (controlla se è vuota) Una pila con al più n elementi può essere rappresentata da un vettore S[1,…, n]. La variabile top[S] punto allultimo elemento inserito top[S] S…S…

3 Pile PUSH(S,x) 1.top[S] top[S]+1 2.S[top[S]] x 379 top[S]= top[S]= PUSH(S,8) La pila consiste di top[S] elementi, ossia di un vettore S[1,…, top[S] ]. S[1] rappresenta lelemento alla base della pila, mentre S[top[S] ] è lelemento alla cima.

4 Pile POP(S,x) 1. if STACK-EMPTY(S) 2.then underflow 3.else top[S] top[S] return S[top[S] + 1] 379 top[S]= top[S]= POP(S) Se la pila è vuota viene generato un errore di underflow. Se top[S] supera n, la pila va in overflow (caso non trattato nel pseudo-codice). Tutte e tre le operazioni richiedono tempo O(1). 8 return 8 STACK-EMPTY(S) 1. if top[S] = 0 2.then return TRUE 3.else return FALSE

5 Code (Queues) Cè una politica FIFO (first-in, first-out), ossia lelemento rimosso dalla coda è quello che è stato inserito da più tempo Operazioni: –ENQUEUE(S,x) (inserisci) –DEQUEUE(S) (elimina,rimuovi) Una coda con al più n elementi può essere rappresentata da un vettore Q[1,…, n]. Le variabili head[Q] e tail[Q] puntano rispettivamente alla testa della coda e alla posizione dove il nuovo elemento sarà inserito. head[Q] Q tail[Q] …

6 Code (Queues) ENQUEUE(Q,x) 1.Q[tail[Q]] x 2. if tail[Q] = length[Q] 3.then tail[Q] 1 4.else tail[Q] tail[Q] tail[Q]= ENQUEUE(Q,5) Quando head[Q]=tail[Q]+1 la coda è piena. Un tentativo di inserire un elemento dalla coda genererà una situazione di overflow head[Q]=3 396 tail[Q]= head[Q]=3 5 Inizialmente si avrà head[Q]=tail[Q]=1. Quando head[Q]=tail[Q] la coda è vuota. Un tentativo di prendere un elemento dalla coda genererà una situazione di underflow.

7 Code (Queues) DEQUEUE(Q) 1.x Q[head[Q]] 2. if head[Q] = length[Q] 3.then head[Q] 1 4.else head[Q] head[Q] return x DEQUEUE(Q,5) I casi di underflow e di overflow non sono trattati nel pseudo-codice. Le operazioni ENQUEUE e DEQUEUE richiedono tempo O(1). 396 tail[Q]= head[Q]= tail[Q]= head[Q]=4 5 return 3

8 Liste concatenate Le liste concatenate consistono in un insieme di elementi disposti luno di seguito allaltro. Diversamente dai vettori (anche detti array) gli elementi non sono indicizzati, ma legati tra loro linearmente attraverso dei puntatori. I puntatori allinterno di un elemento x possono puntare allelemento successivo (next[x]) o a quello successivo (prev[x]). Le liste concatenate sono una struttura di dati semplice e flessibile, soprattutto se si devono rappresentare un insieme di elementi dinamicamente variabile. key prevnext head[L]

9 Doubly linked list Un Doubly linked list è anche detto lista concatenata bidirezionale. Ogni elemento x ha una chiave (key[x]), un puntatore allelemento successivo (next[x]) e un puntatore allelemento precedente (prev[x]). head[L] punta al primo elemento della lista L. Questo primo elemento ha prev[x]=NIL, quindi non ha un elemento che lo precede. Lultimo elemento ha next[x]=NIL, quindi non ha un successore. Quando head[L]=NIL si è in presenza di una lista vuota. key prevnext head[L] NIL

10 Doubly linked list Operazioni: oLIST-SEARCH(L,k) Cerca il primo elemento con chiave k nella lista L. oLIST-INSERT(L,x) Inserisci un elemento x con chiave key[x] nella lista L. oLIST-DELETE(L,x) Elimina lelemeno x con chiave key[x] e puntatori (prev[x], next[x]) nella lista L. key prevnext head[L] NIL

11 Doubly linked list head[L] LIST-SEARCH(L,k) 1.x head[L] 2. while x NIL and key[x] k 3.do x next[x] 4. return x LIST-SEARCH(L,12) xkey[x]= head[L] xkey[x]= head[L] xkey[x]=12 TROVATO! Per una lista di n elementi richiede tempo Θ(n) nel caso peggiore, poiché si deve scorrere lintera lista.

12 Doubly linked list 49- head[L] LIST-INSERT(L,x) 1.next[x] head[L] 2. if head[L] NIL 3.then prev[head[L]] x 4.head[L] x 5.prev[x] NIL LIST-INSERT(L,x) key[x] = 5 5 Per una lista di n elementi richiede tempo O(1), poiché richiede un numero costante di passi. x 49 head[L] 5 x 49 5 x

13 Doubly linked list LIST-DELETE(L,x) 1. if prev[x] NIL 2.then next[prev[x]] next[x] 3. else head[L] next[x] 4. if next[x] NIL 5.then prev[next[x]] prev[x] LIST-DELETE(L,x) key[x] = 9 Per una lista di n elementi richiede tempo O(1), poiché richiede un numero costante di passi. Non comprende la ricerca dellelemento da rimuovere. 49 head[L] 5 x x

14 Luso di una sentinella La sentinella è un oggetto che aiuta a semplificare le condizioni di confine della lista. Consiste di un oggetto nullo (nil[L]) che punta allinizio e alla fine della lista e viene puntato a sua volta dal primo e dallultimo elemento della lista. Quando nil[L] punta e viene punato solo da se stesso la lista L è vuota nil[L]

15 Luso di una sentinella Le operazioni con la presenza della sentinella: LIST-INSERT(L,x) 1.next[x] next[nil[L]] 2.prev[next[nil[L]]] x 3.next[nil[L]] x 4.prev[x] nil[L] LIST-DELETE(L,x) 1.next[prev[x]] next[x] 2.prev[next[x]] prev[x] LIST-SEARCH(L,k) 1.x next[nil[L]] 2. while x nil[L] and key[x] k 3.do x next[x] 4. return x Il codice risulta più compatto. next[nil[L]] prende il posto di head[L].

16 Luso di una sentinella Luso della sentinella rende il codice più compatto e semplice. Non rende il codice più efficiente, anche se può ridurre il tempo di esecuzione di qualche costante. Luso della sentinella può dare un significativo incremento delluso della memoria, soprattutto se si usano molte liste. Questo è dovuto alluso di elemento in più per ogni lista.

17 Liste concatenate Ci possono essere anche liste unidirezionali che usano un solo link (o puntatore). Si chiamano Singly Linked Lists. Le Singly Link Lists rendono la procedura di rimozione di un elemento pari a Θ(n) nel caso peggiore, perché deve essere individuato lelemento precedente. Si possono costruire anche liste circolari da una Doubly Linked Lists, quando il primo elemento della testa punta allultimo e viceversa. key next head[L] 4 5 8

18 Rappresentazione di alberi binari Un albero binario è un albero dove ogni nodo può avere al massimo due figli. Si usano i campi p[x], left[x] e right[x] per puntare rispettivamente al padre e ai due figli del nodo x. Se un figlio non esiste, allora il valore del puntatore è nil. root[T] punta alla radice dellalbero, che ha p[x]=nil. Se root[T]=nil, allora lalbero è vuoto. p[x] left[x] right[x]

19 Rappresentazione di alberi binari root[T] Ecco un esempio. Le foglie sono i nodi senza figli, ossia left[x]=right[x]=nil.

20 Rappresentazione di alberi root[T] Una possibile rappresentazione: left[x] punta al figlio più a sinistra right[x] punta al fratello alla sua destra, se esiste


Scaricare ppt "Strutture dati elementari Pile Code Liste concatenate Alberi medianti puntatori."

Presentazioni simili


Annunci Google