30.05.2013 Views

Appunti per il modulo di algoritmi e strutture dati - Sezione di ...

Appunti per il modulo di algoritmi e strutture dati - Sezione di ...

Appunti per il modulo di algoritmi e strutture dati - Sezione di ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

❄<br />

E<br />

❄<br />

❄<br />

❄<br />

B C D<br />

❄<br />

F<br />

A<br />

0 0 0 0 0 0<br />

❄<br />

G<br />

0 0 0 0 0 0 0 0 0<br />

Figura 8: La memorizzazione M1 dell’albero in figura 6<br />

Riconsideriamo l’albero or<strong>di</strong>nato <strong>di</strong> figura 6 e la sua memorizzazione figlio-fratello, mostrata in figura<br />

9. È fac<strong>il</strong>e rendersi conto che, applicando preorder otteniamo la linearizzazione dell’albero secondo<br />

l’or<strong>di</strong>ne anticipato, anche se la funzione non è definita con gli stessi casi della definizione <strong>di</strong> albero<br />

generico ( preorder ha come caso base l’albero vuoto, che non è un albero generico, mentre <strong>il</strong> caso base<br />

della definizione è l’albero composto da un solo nodo). Per ottenere la linearizzazione <strong>di</strong>fferita dell’albero,<br />

è fac<strong>il</strong>e rendersi conto che possiamo ut<strong>il</strong>izzare la visita simmetrica. Infatti, adottando la memorizzazione<br />

figlio-fratello, è come se avessimo “trasformato” l’albero in un albero binario, con la proprietà che<br />

• la visita <strong>di</strong>fferita dell’albero corrisponde alla visita simmetrica del trasformato.<br />

Quin<strong>di</strong> <strong>il</strong> tempo delle visite in un albero generico è lineare nel numero dei no<strong>di</strong>. Per quanto riguarda la<br />

ricerca, l’inserimento e la cancellazione <strong>di</strong> un nodo, <strong>il</strong> tempo è comunque lineare. Infatti queste o<strong>per</strong>azioni<br />

possono essere programmate mantenendo la struttura delle visite.<br />

Supponiamo ora <strong>di</strong> voler calcolare la complessità delle visite prendendo come <strong>di</strong>mensione i livelli<br />

dell’albero. Abbiamo<br />

T (0) = a<br />

T (n) = 2T (n − 1) + b n > 1<br />

Infatti se l’albero ha livello 0, cioè è composto dalla sola ra<strong>di</strong>ce, <strong>il</strong> tempo è costante: se l’albero ha n<br />

livelli, <strong>il</strong> tempo è un tempo costante <strong>per</strong> la visita della ra<strong>di</strong>ce più <strong>il</strong> tempo <strong>di</strong> visita <strong>di</strong> due sottoalberi,<br />

ognuno con al massimo n − 1 livelli. Se risolviamo la relazione, ve<strong>di</strong>amo che T (n) è O(2 n ), che è un<br />

tempo esponenziale (la relazione <strong>di</strong> ricorrenza è lineare).<br />

7.2 Esempi <strong>di</strong> programmi su alberi generici<br />

Consideriamo la memorizzazione figlio-fratello. La funzione seguente conta le foglie <strong>di</strong> un albero generico.<br />

Si noti la <strong>di</strong>fferenza con la funzione, definita nella sezione 6.2 che conta le foglie <strong>di</strong> un albero binario:<br />

mentre in un albero binario una foglia ha entrambi i sottoalberi vuoti, in un albero generico, se un nodo<br />

ha <strong>il</strong> campo left a NULL, allora non ha nessun figlio, cioè è una foglia.<br />

36

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!