elenco    
        corso    

Algoritmica e Laboratorio

Codice: 008AACrediti: 12Semestre: 2Sigla: AlL 
 
Settore disciplinare: INF/01 - Informatica

Docente

Anna Bernasconi   annab@di.unipi.it  Stanza 322  Tel. 0502213121

Prerequisiti

Conoscenza dei basilari Principi di Programmazione e del Linguaggio C. In particolare, per un più proficuo utilizzo delle ore di laboratorio, si consiglia fortemente di studiare approfonditamente i primi 5 capitoli del libro di testo consigliato per le attività di laboratorio (Il Linguaggio C).
Nozioni matematiche: proprietà e limiti di funzioni, sommatorie, numeri di Fibonacci, permutazioni, coefficienti binomiali, aritmetica modulare, numeri primi, metodi di dimostrazione (per induzione, per assurdo, per casi).

Obiettivi di apprendimento

Definire formalmente la nozione di algoritmo e di modello di calcolo. Caratterizzare i dati da elaborare, organizzandoli e strutturandoli nel modo più opportuno al fine di agevolarne l'uso da parte di un algoritmo. Progettare e realizzare in C algoritmi corretti (che risolvono cioé sempre e solo il problema a cui si è interessati) ed efficienti (cioé che lo risolvono il più velocemente possibile o usano il minor spazio di memoria possibile), attraverso l'esame di diversi paradigmi. Studiare le limitazioni inerenti dei problemi da risolvere, in particolare di quelli la cui soluzione richiede l'esame di tutte le possibilità.
Conoscenze. Cosa è un algoritmo e cosa è un modello di calcolo. Saper caratterizzare i dati da elaborare strutturandoli nel modo più opportuno al fine di agevolarne l'uso da parte degli algoritmi. Conoscere le strutture dati e le tecniche fondamentali per il progetto di algoritmi (di base). Conoscere le tecniche di valutazione della complessità e le limitazioni inerenti dei problemi da risolvere. Caratterizzare i problemi indecidibili ed esponenziali. Conoscere il linguaggio C e saper realizzare con esso gli algoritmi e le strutture dati viste in classe.
Capacità. Saper progettare e realizzare in un linguaggio imperativo (es. C) algoritmi corretti ed efficienti attraverso l'uso di strutture dati e tecniche algoritmiche di base. Saper valutare la complessità di un algoritmo in tempo e spazio, al caso pessimo e al caso medio, e secondo la complessità ammortizzata. Saper valutare le limitazioni inerenti del calcolo.
Comportamenti. Lo studente saprà realizzare in un linguaggio imperativo (es. linguaggio C) gli algoritmi e le strutture dati viste in classe. Lo studente saprà inoltre stimare la bontà (leggi, efficienza in tempo e spazio) di un sofwtare sulla base delle caratteristiche progettuali salienti, prescindendo dunque dalla macchina, dal linguaggio di sviluppo o dal sistema operativo sul quale il software viene eseguito. Allo stesso modo, saprà stimare le prestazioni degli algoritmi prima di arrivare alla fase di programmazione, debugging e profiling, mediante l'uso di modelli matematici opportuni.

Descrizione

L'obiettivo del corso è quello di introdurre strutture dati e tecniche algoritmiche (di base) che consentano allo studente la risoluzione di problemi su sequenze, liste, alberi e grafi, in modo efficiente in tempo e/o spazio. Introdurremo inoltre alcune tecniche per valutare le prestazioni degli algoritmi, o le limitazioni inerenti del calcolo. Infine svolgeremo una intensa attività di laboratorio che porterà gli studenti a sperimentare in linguaggio C le nozioni e le tecniche algoritmiche apprese in classe.

Indicazioni metodologiche


Programma

  1. Introduzione informale agli algoritmi
    • I numeri di Fibonacci
    • Algoritmo numerico
    • Algoritmo ricorsivo
    • Algoritmo iterativo
    • Occupazione di memoria e altro algoritmo iterativo
    • Introduzione alla notazione asintotica
    • Algoritmo basato su potenze ricorsive
    • Nota sulla dimensione dell'istanza in ingresso 
  2. Modelli di calcolo e metodologie di analisi
    • Modelli di calcolo
    • Criteri di costo (uniforme e logaritmico)
    • La notazione asintotica (O, O, T)
    • Costo degli algoritmi e complessità dei problemi
    • Metodi di analisi (caso peggiore, migliore e medio)
      • Ricerca sequenziale
      • Ricerca binaria
    • Analisi di algoritmi ricorsivi
      • Metodo iterativo
      • Metodo della sostituzione
      • Analisi dell'albero di ricorrenza
      • Metodo del cambiamento di variabile
      • Master Theorem (con dimostrazione)  
      • Introduzione all'Analisi Ammortizzata
  3. Strutture dati elementari  
    • Strutture indicizzate: array
    • Strutture collegate: record e puntatori
    • Dizionari
    • Pile e code
    • Relazione tra Pila e Ricorsione
    • Alberi
      • Rappresentazioni indicizzate
      • Rappresentazioni collegate
      • Visite di alberi
  4. Ordinamento con confronti 
    • Limite inferiore al problema
    • Algoritmi quadratici: Selection Sort, Insertion Sort, Bubble Sort
    • Heapsort
    • Mergesort
    • Introduzione al Quicksort
    • Analisi di complessità nel caso medio del Quicksort 
  5. Altri tipi di ordinamento
    • Integer sort, Bucket sort, Radix sort
  6. Laboratorio C n. 1 . Per la lezione, è di fondamentale importanza conoscere:
    • Struttura generale di un programma C
    • Sintassi di:
      • Dichiarazione variabili
      • Array
      • Dichiarazione e invocazione di funzioni
  7. Selezione del k-esimo elemento 
    • Heapselect
    • Quickselect
    • Mediano dei mediani
  8. Alberi di ricerca  
    • Alberi binari di ricerca
    • Alberi AVL  
    • Alberi 2-3  
    • Panoramica sui B-Alberi
  9. Laboratorio C n. 2. 
    • Fibonacci numerico
    • Fibonacci ricorsivo (esponenziale)
    • Fibonacci iterativo con array
    • Fibonacci iterativo con 3 variabili
    • Selection Sort e Insertion Sort
  10. Tabelle hash  
  11. Tecniche algoritmiche
    • Divide et impera
    • Programmazione dinamica 
    • Greedy
  12. Stringhe
    • Definizioni
    • Distanza fra 2 stringhe
    • Massima sottosequenza comune
  13. Laboratorio C n. 3.  
    • Implementazione tramite puntatori degli esercizi su array svolti finora
    • Mergesort
    • Quicksort (con scelta random del perno)
    • Heapsort (in loco)
    • Definizioni e terminologia
    • Rappresentazione di grafi
    • Visite in ampiezza (BFS) e in profondità (DFS) e loro proprietà
    • Componenti connesse di un grafo non orientato 
    • Componenti fortemente connesse di un grafo orientato
  14. Laboratorio C n. 4.
    • LeggiScriviChar(): Lettura e scrittura di caratteri con getchar() e putchar()
    • Reverse1(): inversione di una stringa costante
    • Reverse2(): inversione di una serie di stringhe lette da tastiera
           

      Bibliografia

      • Teoria
        • C. Demetrescu, I. Finocchi e G. F. Italiano, Algoritmi e Strutture Dati, McGraw-Hill, seconda edizione, 2008
        • P. Crescenzi, G. Gambosi e R. Grossi, Strutture di dati e algoritmi, Pearson – Addison Wesley, 2006
      • Laboratorio (Programmazione in C)
        • B.W. Kernighan, D.M. Ritchie. Il Linguaggio C, Pearson-Prentice Hall, seconda edizione, 2004

      Modalità di esame

      La prova d'esame consiste di due parti:

      1. Prova scritta individuale
      2. Prova orale individuale

      Ulteriore pagina web del corso: http://www.cli.di.unipi.it/doku/doku.php/informaticaapplicata/all/start


home


email