Introduzione alla Libreria LEDA - Cosa è LEDA
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
•Vincenzo Auletta Introduzione alla Libreria LEDA Cosa è LEDA ü LEDA è una libreria contenente implementazioni di -02 algoritmi e strutture dati Laboratorio di Algoritmi e Strutture Dati 2001 ® Library of Efficient Data types and Algorithms ü La libreria è strutturata in modo da poter essere utilizzata anche da persone non esperte ® si possono utilizzare gli algoritmi e le strutture dati senza conoscerne l'implementazione ü LEDA è implementata in C++ ® ogni struttura dati è implementata da un template di classe ® ogni algoritmo è implementato da un template di funzione ü tutti i template possono essere istanziati con tipi definiti dall'utente 1 •Corso di Programmazione in C++ •1
•Vincenzo Auletta Struttura della libreria ü LEDA è strutturata su 5 archivi, ognuno dei quali contiene l'immagine eseguibile di una parte delle funzioni della libreria -02 ü esistono due versioni di ciascun archivio Laboratorio di Algoritmi e Strutture Dati 2001 ® archivio statico (.a) e archivio dinamico (.so) ü LibL ® strutture dati base (liste, stack, vettori, stringhe, ecc.) ü LibG ® strutture dati e algoritmi legati ai grafi (grafo diretto e non diretto, array di nodi er archi, BFS, ecc.) ü LibP ® strutture dati e algoritmi legati alla geometria del piano ü LibW ® classi utilizzate per l'interfaccia grafica a finestre sotto X11 ü LibD3 ® strutture dati e algoritmi legati alla geometria dello spazio LibD3 2 Come utilizzare la libreria ü Per utilizzare una classe X di LEDA si deve -02 Laboratorio di Algoritmi e Strutture Dati 2001 includere la dichiarazione (in genere X.h) e linkare l'archivio contenente l'implementazione di X ü Gli header file della libreria si trovano nella directory /usr/include/g++-include/LEDA ü Gli archivi delle implementazioni si trovano in /usr/local/lib 3 •Corso di Programmazione in C++ •2
•Vincenzo Auletta Esempio Utilizzo di Stack // --------------------- prova.C ------------------------- #include -02 Laboratorio di Algoritmi e Strutture Dati 2001 #include int main() { stack S; S.push("ciao"); string s = S.pop(); return 0; } g++ prova.C –lL 4 Informazioni sulla libreria ü E' possibile recuperare informazioni sulla libreria e sul -02 Laboratorio di Algoritmi e Strutture Dati 2001 suo utilizzo da varie fonti ü Manuale utente ® copia cartacea reperibile dal docente ® copia elettronica (formato ps o dvi) reperibile nella directory /usr/share/doc/packages/leda ® copia html disponibile su Internet ü Libro su Leda ® K. Melhorn, S. Naher, LEDA: A platform for Combinatorial and Geometric Computing (disponibile in biblioteca) ü sito della Algorithmic Solutions ® società proprietaria della libreria 5 •Corso di Programmazione in C++ •3
•Vincenzo Auletta Utilizzo del Manuale ü Il manuale contiene una scheda per ogni struttura dati -02 Laboratorio di Algoritmi e Strutture Dati 2001 presente nella libreria ü Ogni scheda contiene ® definizione formale del tipo di dato astratto ® esempio di definizione di un oggetto ® lista dei prototipi dei metodi pubblici w per ogni metodo viene descritta l'operazione corrispondente e sono specificate eventuali precondizioni ® cenni sull'implementazione e sulla efficienza dei vari metodi ü Per ogni algoritmo viene specificato il prototipo della funzione che lo implementa e le eventuali precondizioni 6 Controllo Precondizioni ü Un metodo di una classe implementa correttamente la corrispondente operazione solo se le precondizioni sono -02 soddisfatte Laboratorio di Algoritmi e Strutture Dati 2001 ü LEDA non garantisce che il metodo verifichi se le precondizioni sono soddisfatte ® in alcuni casi le controlla ® il programma deve preoccuparsi di invocare un metodo solo se le sue precondizioni sono soddisfatte ü Se una precondizione non è soddisfatta il metodo potrebbe comportarsi in modo non corretto ® l'errore non è della libreria ü Per motivi di efficienza si può eliminare dal codice di LEDA qualsiasi controllo sulle precondizioni ® compilare con l'opzione –D LEDA_CHECKING_OFF 7 •Corso di Programmazione in C++ •4
•Vincenzo Auletta Esempio Controllo Precondizioni template T stack::pop(); -02 // precondizione: lo stack non è vuoto Laboratorio di Algoritmi e Strutture Dati 2001 int main() { stack S; string s = S.pop(); // segmentation fault in stack::pop() … } // versione corretta if(!S.empty()) string s = S.pop(); 8 Istanziazione dei Template della libreria ü Molte classi della libreria sono template che possono -02 essere istanziati rispetto a qualsiasi tipo di dato Laboratorio di Algoritmi e Strutture Dati 2001 ® anche tipi definiti dall'utente ü LEDA assume che una classe utilizzata per istanziare uno dei suoi template soddisfi le seguenti condizioni ® costruttore di default, costruttore per copia, operatore di assegnamento e distruttore ® operatori di input (>>) e output (
•Vincenzo Auletta Esempio Istanziazione Template class Studente { friend ostream& operator(const istream&, Studente&); public: Studente(); Studente(const Studente&); Studente& operator=(const Studente&); ~Studente(); … }; stack S; dictionary D; // ERRORE 10 Esempio Istanziazione Template class X { friend ostream& operator(const istream&, X &); public: X(); dictionary< X, int> D; X(const X &); h_array< X, int> H; X & operator=(const X &); ~ X(); }; int compare(const X &, const X &); int Hash(const X &); bool operator ==(const X &, const X &); 11 •Corso di Programmazione in C++ •6
•Vincenzo Auletta Tipi Ordinati ü Diversi tipi di dati richiedono che le classi usate per -02 istanziare il template siano ordinati Laboratorio di Algoritmi e Strutture Dati 2001 ® es. dizionari, code a priorità, sequenze ordinate ü Se il tipo parametrizzato T deve essere ordinato allora deve esistere una funzione per confrontare oggetti di tipo T template int compare(const T& a, const T& b); // = 0 se a == b, // < 0 se a < b, // > 0 se a > b 12 Tipi con Differenti Relazioni d'Ordine ü In alcuni casi si deve utilizzare un tipo ordinato T con riferimento ad una relazione d'ordine diversa da -02 Laboratorio di Algoritmi e Strutture Dati 2001 quella definita dalla compare ® Es. dizionario di stringhe ordinate per lunghezza ü utilizza la macro DEFINE_LINEAR_ORDER per creare una nuova classe che usa la nuova relazione d'ordine int str_len(const string&, const string&); DEFINE_LINEAR_ORDER(string, str_len, string_len) dictionary D; // D ordina le chiavi per lunghezza ü passa al costruttore di dictionary la funzione da usare per ordinare le chiavi dictionary D(str_len); 13 •Corso di Programmazione in C++ •7
•Vincenzo Auletta Tipi Hashed ü Alcune classi di LEDA applicano funzioni hash ai tipi -02 Laboratorio di Algoritmi e Strutture Dati 2001 parametrizzati rispetto ai quali è definita la classe ® se T è un tipo hashed allora devono esistere le funzioni template int Hash(const T& a); template bool operator==(const T&, const T&); ü Per tutti i tipi predefiniti esiste una funzione hash di default ü funzione di conversione ad intero (non efficiente) 14 Item ü Tutta la libreria LEDA è basata sul concetto di item -02 indirizzo di un contenitore che può mantenere dei valori Laboratorio di Algoritmi e Strutture Dati 2001 ® (astrazione di puntatore C) ® non tutti gli item sono implementati come puntatori ü Esistono diversi tipi di item ® dic_item, list_item, stack_item, node, edge ® string, point, pair ü Una variabile di tipo list_item contiene l'indirizzo di un oggetto list_container (nodo di una lista) ® i membri del contenitori sono detti attributi dell'item ® un list_container contiene un campo chiave, un campo informazione e altri campi necessari ad implementare la struttura dati sottostante 15 •Corso di Programmazione in C++ •8
•Vincenzo Auletta Tipi di Item ü Tutti gli item della libreria possono essere divisi in due -02 Laboratorio di Algoritmi e Strutture Dati 2001 categorie: item dipendenti ed indipendenti ü item dipendenti ® indirizzano contenitori che esistono solo come elementi di una collezione (nodi di una struttura dati) ® le due uniche operazioni consentite sono assegnamento e uguaglianza ® Es. dic_item, list_item, stack_item, node, edge ü item indipendenti ® indirizzano contenitori che sono auto sufficienti ® string, point, line, pair ® non possono modificare gli attributi del contenitore 16 Uguaglianza tra Item ü Il significato dell'operatore di uguaglianza è -02 Laboratorio di Algoritmi e Strutture Dati 2001 diverso per i vari tipi di item ü due item dipendenti sono uguali se indirizzano lo stesso contenitore ® bool operator==(const list_item&, const list_item&); ü due item indipendenti sono uguali se puntano a contenitori che contengono gli stessi valori ® bool operator==(const string&, const string&); ü due item indipendenti che indirizzano lo stesso contenitore sono identici ® bool identical(const string&, const string&); 17 •Corso di Programmazione in C++ •9
•Vincenzo Auletta Strutture dati come Collezioni di Item ü Molte strutture dati di LEDA sono costituite da collezioni -02 Laboratorio di Algoritmi e Strutture Dati 2001 di item dipendenti ® la collezione ha una organizzazione definita dalla struttura dati ü list ® collezione di list_item, ognuno dei quali indirizza un nodo con un campo informazione di tipo K e punta al nodo successivo ü dictionary ® collezione di dic_item, ognuno dei quali indirizza un nodo contenente un campo chiave di tipo K e un campo informazione di tipo I ® i campi chiave dei nodi devono essere distinti e K deve essere un tipo su cui è definta una relazione d'ordine 18 Operazioni su Strutture Dati ü Le strutture dati definite come collezioni di item -02 implementano le loro operazioni con metodi che lavorano Laboratorio di Algoritmi e Strutture Dati 2001 sugli item ® è illegale usare l'item dopo che la struttura dati è stata distrutta template class dictionary { dictionary rubrica; public: /* incrementa il valore dic_item lookup(K key); associato alla chiave mario */ I inf(dic_item it); dic_item it = rubrica.lookup("mario"); void change_inf(dic_item it, I int n = rubrica.inf(it); new_val); rubrica.change_inf(it, n+1); … }; 19 •Corso di Programmazione in C++ •10
•Vincenzo Auletta Copie ed Assegnamenti ü Tutte le classi di LEDA hanno costruttore per -02 Laboratorio di Algoritmi e Strutture Dati 2001 copia, operatore di assegnamento e distruttore definiti opportunamente ü Copiare un oggetto di una classe significa copiare tutti i suoi item ® gli item dipendenti vengono duplicati ® gli item indipendenti vengono gestiti con il reference counting 20 Passaggio dei Parametri ü La libreria utilizza il passaggio per valore solo -02 Laboratorio di Algoritmi e Strutture Dati 2001 per passare argomenti di tipo predefinito ü Argomenti di tipo parametrico e di tipo non predefinito sono sempre passati per riferimento ® se l'argomento non deve essere modificato il riferimento è costante 21 •Corso di Programmazione in C++ •11
•Vincenzo Auletta Iterazioni ü I tipi di dato formati da collezioni di item -02 Laboratorio di Algoritmi e Strutture Dati 2001 possono essere scanditi attraverso delle iterazioni ® implementate come macro ® nascondono all'utente la struttura delle classi della libreria ü Un'iterazione su una collezione di item C deve soddisfare le seguenti condizioni ® non può aggiungere item alla collezione ® può modificare gli attributi di un item ® può rimuovere un item solo quando lo sta visitando 22 Tipi di Iterazioni forall_items(it, D) forall_rev_items(it, D) -02 Laboratorio di Algoritmi e Strutture Dati 2001 // tutti gli item di D sono assegnati in successione a it // solo per le liste e gli insiemi forall(s, L) forall_rev(s, L) // solo per i grafi forall_nodes(v, G) // scorre tutti i nodi di G forall_edges(e, G) // scorre tutti gli archi di G forall_adj_edges(e, v) // scorre la lista degli archi adiacenti al vertice v 23 •Corso di Programmazione in C++ •12
•Vincenzo Auletta Esempi di Iterazioni list L; list_item s; -02 Laboratorio di Algoritmi e Strutture Dati 2001 … forall(s, L) if(L[s] == 5) L.del(s); // cancella dalla lista L tutti i nodi che contengono 5 graph G; … node v, s = G.new_node(); forall_nodes(v, G) if(s != v) G.new_edge(s, v); // aggiunge un nodo s a G e lo collega a tutti gli altri nodi 24 Iterazioni stile STL ü Alcuni tipi di dati di LEDA consentono anche di -02 Laboratorio di Algoritmi e Strutture Dati 2001 scorrere la collezione di item utilizzando gli iteratori della libreria standard (STL) list L; int cont = 0; … for(list::iterator it = L.begin(); it != L.end(); it++) if(*it == 5) cont++; // conta il numero di occorrenze di 5 in L 25 •Corso di Programmazione in C++ •13
•Vincenzo Auletta Utilizzo di LEDA con STL ü Per evitare conflitti di nomi tr classi di LEDA e -02 Laboratorio di Algoritmi e Strutture Dati 2001 di STL in compilatori che non supportano i namespace a tutte le classi di LEDA è aggiunto automaticamente il prefisso leda ® Es. list à leda_list ü Se si vuole eliminare l'inserimento del prefisso davanti al nome di tutte le classi della libreria si deve compilare il programma con l'opzione –D LEDA_PREFIX 26 Parametri di Implementazione ü Per i dizionari, le code a priorità e le sequenze -02 Laboratorio di Algoritmi e Strutture Dati 2001 ordinate è possibile scegliere la struttura dati che deve essere utilizzata per l'implementazione // implementazione di default #include dictionary D; // implementazione con alberi RossoNeri #include #include _dictionary ü E' possibile fornire la propria implementazione 27 •Corso di Programmazione in C++ •14
•Vincenzo Auletta Esempio: Contatore Parole ü Calcola il numero di occorrenze di ogni parola in un testo -02 Laboratorio di Algoritmi e Strutture Dati 2001 #include #include void main() { d_array cont(0); string s; while(cin >> s) cont[s]++; forall_defined(s, cont) cout
•Vincenzo Auletta Esempio: BFS -- 2 while(!Q.empty()) { color[s]=GRAY; -02 u=Q.pop(); Laboratorio di Algoritmi e Strutture Dati 2001 d[s]=0; forall_adj_nodes(v,u){ Q.append(s); if (color[v]==WHITE) { color[v]=GRAY; d[v]=d[u]+1; pred[v]=u; Q.append(v); } color[u]=BLACK; } } 30 Esempio: Costruzione di un Grafo Casuale #include #include -02 Laboratorio di Algoritmi e Strutture Dati 2001 #include cout > e; graph G; random_simple_undirected_graph(G,n,e); Make_Bidirected(G); StampaGrafo(G); 31 •Corso di Programmazione in C++ •16
•Vincenzo Auletta Esempio: Chiamata di BFS -02 Laboratorio di Algoritmi e Strutture Dati 2001 node_array distanza(G,9999); node_array colore(G,WHITE); node_array pred(G,NULL); node s = G.choose_node(); bfs(G, s, distanza, colore, pred); 32 •Corso di Programmazione in C++ •17
Puoi anche leggere