Informatica 3 Informatica 3 LEZIONE 6: Implementazioni avanzate per liste e array Lezione 6 - Modulo Modulo : Skip list Modulo : Multiliste Modulo 3: Rappresentazioni di matrici Skip list Politecnico di Milano - Prof. Sara Comai Politecnico di Milano - Prof. Sara Comai Introduzione Skip list: struttura dati probabilistica basata su liste in alternativa a BST e strutture ad albero (richiedono bilanciamento) semplice da implementare fornisce buone prestazione con alta probabilità Politecnico di Milano - Prof. Sara Comai 3 Esempio 5 5 3 3 4 58 6 69 5 5 3 3 4 58 6 69 5 5 3 3 4 58 6 69 Politecnico di Milano - Prof. Sara Comai 4
Skip list () Ricerca di un elemento: si segue il puntatore di livello più alto L fino a quando si trova un valore più grande di quello cercato dal nodo dello stesso livello immediatamente precedente si prosegue la ricerca al livello L- e si ripete il processo Esempio: ricerca del numero 6 5 5 3 3 4 58 6 69 Caso peggiore: Θ(log n) Politecnico di Milano - Prof. Sara Comai 5 Skip list () Ricerca di un elemento: si segue il puntatore di livello più alto L fino a quando si trova un valore più grande di quello cercato dal nodo dello stesso livello immediatamente precedente si prosegue la ricerca al livello L- e si ripete il processo Esempio: ricerca del numero 6 5 5 3 3 4 58 6 69 Caso peggiore: Θ(log n) Politecnico di Milano - Prof. Sara Comai 6 Skip list () Skip list ideale: metà dei nodi hanno un puntatore ¼ dei nodi hanno due puntatori /8 dei nodi hanno 3 puntatori... Distanze hanno gli stessi spazi bilanciamento Inserimento di un nuovo nodo Il processo per mantenere la skip list bilanciata è costoso quando si inserisce un nuovo nodo si assegna in modo random il livello al nodo con una distribuzione esponenziale 3 5% il nodo ha un puntatore 3 5% il nodo ha due puntatori... Politecnico di Milano - Prof. Sara Comai 7 Politecnico di Milano - Prof. Sara Comai 8 5 5 5 3
Prestazioni Implementazione () Se molti nodi hanno molti puntatori: Θ(n) Se molti nodi hanno pochi puntatori: equivalente a una lista concatenata Θ(n) Nel caso medio tutte le operazioni: Θ(log n) in pratica la skip list è probabile che abbia prestazioni migliori di un BST un BST può avere prestazione peggiori a seconda dell ordine con cui i dati vengono inseriti nell albero la skip list non dipende dall ordine con cui i dati vengono inseriti all aumentare del numero dei nodi nella skip list, la probabilità di ottenere il caso peggiore decresce esponenzialmente Politecnico di Milano - Prof. Sara Comai 9 Ricerca di un valore: forward: array che contiene i puntatori dei diversi livelli della skip list template <class Key, class Elem> bool SkipList<Key, Elem>:: find(const Key& K, Elem& e) const { SkipNode<Elem> *x = ; // Dummy er node for (int i=level; i>=; i--) while ((x->forward[i]!= NULL) && (K > x->forward[i]->value)) x = x->forward[i]; x = x->forward[]; // Move to actual record, if it exists if ((x!= NULL) && (K == x->value)) { e = x->value; return true; else return false; Politecnico di Milano - Prof. Sara Comai Implementazione () Determinazione del livello in base alla distribuzione esponenziale: int randomlevel(void) { int level; for (level=; Random() == ; level++); // Do nothing return level; (5%) (5%) (5%) -->5% (5%) -->5% livello livello Politecnico di Milano - Prof. Sara Comai Implementazione (3) Inserimento di un nuovo nodo template <class Key, class Elem> bool SkipList<Key, Elem>:: insert(const Elem& val) { int i; SkipNode<Elem> *x = ; // Start at er node int newlevel = randomlevel(); // Select level for new node if (newlevel > level) { // New node is deepest in list AdjustHead(newLevel); // Add null pointers to er level = newlevel; SkipNode<Elem>* update[level+]; // Track ends of levels for(i=level; i>=; i--) { // Search for insert position while((x->forward[i]!= NULL) && (x->forward[i]->value < val)) x = x->forward[i]; update[i] = x; // Keep track of end at level i Politecnico di Milano - Prof. Sara Comai
Implementazione (3) Informatica 3 Inserimento di un nuovo nodo (cont.)... x = new SkipNode<Elem>(val, newlevel); // Create new node for (i=; i<=newlevel; i++) { // Splice into list x->forward[i] = update[i]->forward[i]; // Where x points update[i]->forward[i] = x; // Where y points reccount++; return true; Lezione 6 - Modulo Multiliste Politecnico di Milano - Prof. Sara Comai 3 Politecnico di Milano - Prof. Sara Comai 4 Introduzione Lista pura Estensione della definizione di lista: multilista gli elementi di una multilista possono essere un atomo una lista: SOTTO-LISTA Lista pura: struttura a lista il cui grafo corrisponde a un albero esiste un unico percorso per ogni nodo nessun oggetto può apparire più di una volta nella lista Notazione: (x, (y, (a, a), y3), (z, z), x4) sotto-lista sotto-lista sotto-lista x y y3 z z x4 a a Politecnico di Milano - Prof. Sara Comai 5 Politecnico di Milano - Prof. Sara Comai 6
Lista rientrante () Lista rientrante: struttura a lista il cui grafo corrisponde a un DAG i nodi possono essere raggiunti dalla radice tramite più percorsi gli oggetti possono apparire più di una volta nella lista Lista rientrante () Notazione con sottoliste etichettate: (((a,b)),((a,b),c),(c,d,e),(e)) ((L:(a,b)),(L,L:c),(L,d,L3:e),(L3)) a L L L3 c d e b (((a,b)),((a,b),c),(c,d,e),(e)) a L b L c d L3 e Politecnico di Milano - Prof. Sara Comai 7 Politecnico di Milano - Prof. Sara Comai 8 Lista rientrante () Implementazione tramite array Lista ciclica: L L a b L3 c d L4 Implementazione tramite array: le sottoliste possono essere viste come elementi di lunghezza variabile occorre indicare l inizio e la fine di una sottolista implementazione ad albero sequenziale (L: (L: (a, L)), (L, L3: b), (L3, c, d), L4: (L4)) l accesso all n-esimo elemento richiede una visita sequenziale della lista Politecnico di Milano - Prof. Sara Comai 9 Politecnico di Milano - Prof. Sara Comai
Implementazione tramite liste concatenate () Le liste pure possono essere implementate tramite liste concatenate con un campo addizionale che indica se il nodo è un atomo o una sottolista in caso di sottolista il campo dei dati punta al primo elemento di una sottolista Implementazione tramite liste concatenate () Altro approccio: Tutti gli elementi della lista hanno due puntatori, eccetto gli atomi gli atomi contengono solamente i dati + x - - + x4 root + z + z + + y B C D - a Politecnico di Milano - Prof. Sara Comai A Politecnico di Milano - Prof. Sara Comai Informatica 3 Introduzione Lezione 6 - Modulo 3 Rappresentazioni di matrici Molte applicazioni devono rappresentare grandi matrici bidimensionali in cui molti elementi hanno valore Esempi: matrici triangolari matrici sparse Risparmiare spazio utilizzando delle liste che contengono i valori diversi da Politecnico di Milano - Prof. Sara Comai 3 Politecnico di Milano - Prof. Sara Comai 4
Matrice triangolare a a a a a 3 a a a a a 3 a a a a a 3 a 3 a 3 a 3 a 33 a 33 Lista di lunghezza n(n+)/ caso matrice triangolare inferiore: riga : primo elemento diverso da riga : primi due elementi diversi da la riga r è preceduta da r righe contenenti FORMULA elementi diversi da aggiungendo c si raggiunge la c-esima posizione della riga matrice[r,c] = lista[(r + r)/ + c] caso matrice triangolare superiore: matrice[r,c] = lista[rn - (r + r)/ + c] Politecnico di Milano - Prof. Sara Comai 5 Matrice sparsa () Metodo : concatenare le coordinate r e c degli elementi con valore diverso da in un unico valore e utilizzare questo valore come chiave in una tabella di hash occorre conoscere la posizione dei valori da cercare non si può trovare il primo elemento diverso da in una determinata riga/colonna Politecnico di Milano - Prof. Sara Comai 6 Matrice sparsa () Matrice sparsa (3) Metodo : implementazione tramite una lista ortogonale lista di puntatori a righe liste di record della matrice lista di puntatori a colonne liste di record della matrice ogni elementi diverso da punta ai vicini diversi da che lo precedono e gli succedono sia nella riga che nella colonna colonne righe 3 6 A A A 6 A A 3 4 A 4 7 A 7 A76 Politecnico di Milano - Prof. Sara Comai 7 Politecnico di Milano - Prof. Sara Comai 8
Matrice sparsa (4) Prestazioni in termini di spazio: se i dati, gli indici di riga e colonna e il puntatore richiedono 4 byte, una matrice nxm richiede 4nm byte se la matrice sparsa richiede 8 byte per 4 puntatori, due indici di array e un valore, una matrice nxm con X% valori diversi da richiede 8nmX byte 8mnX = 4mn X = /7 4% Politecnico di Milano - Prof. Sara Comai 9