[01] Algoritmi e Implementazione - Presentation Transcript
Algoritmi e loro implementazione in Java
Dott. Francesco De Angelis
francesco.deangelis@unicam.it
Dipartimento di Matematica e Informatica
Laboratorio di Algoritmi e Stutture Dati - AA 2009/10
Sommario
• Ciclo di sviluppo del codice algoritmico
• Fase di progettazione
• Fase di realizzazione
• Implementazione in Java
2
Ciclo di svilppo di codice algoritmico
• Lo sviluppo di software robusto ed efficiente richiede:
• creatività
• capacità di astrazione
• familiarità con strumenti matematici
• padronanza di un linguaggio di programmazione
• conoscenza delle caratteristiche della piattaforma di calcolo
• Distinguiamo una fase progettuale ed una fase realizzativa
3
Fase Progettuale
• Tramite l’analisi dei requisiti si definisce in modo preciso e non ambiguo il problema
di calcolo che si intende risolvere
• Con la valutazione delle difficoltà vorremmo sempre minimizzare le risorse ma
esistono limiti inferiori oltre i quali non è possibile scendere
• ogni algoritmo richiede inevitabilmente risorse di calcolo in termini di tempo e di
spazio
• stimare questi limiti è utile per valutare la difficoltà intrinseca di un problema
• Per un dato problema algoritmico possono essere progettati algoritmi risolutivi diversi
• L’obiettivo è trovare il metodo che faccia un uso ottimale delle risorse di calcolo
• Definito l’algoritmo è necessario effettuare un’analisi di correttezza formale
• ad esempio dimostrando che proprietà dell’algoritmo vengono mantenute ad
ogni passo
4
Fase Progettuale
• Inoltre è necessario effettuare una verifica delle prestazioni
• Un’attenta analisi teorica aiuta a scegliere tra diverse soluzioni allo stesso
problema prima di effettuare l’implementazione
• Per rendere indipendente l’analisi dalla particolare istanza si esprime il tempo di
esecuzione in funzione della dimensione dell’istanza di ingresso
• Possiamo distingure diverse tipologie di analisi:
• caso peggiore misura il tempo nel caso di istanze sfavorevoli per l’algoritmo
• caso migliore misura il tempo per le istanze favorevoli per l’algoritmo
• caso medio esprime il tempo utilizzato “in media” (in funzione della distribuzione
statistica dei dati in ingresso)
• E’ comodo usare la notazione asintotica, usata per quantificare qualsiasi tipo di
risorsa di calcolo
5
Notazione Asintotica
• L’idea di base è trattare due funzioni come “uguali” se i loro valori differiscono solo
per un fattore costante
• Per n sufficientemente grande (n ≥ n0) e per opportune costanti moltiplicative (c, c1,
c2) si ha:
• se una funzione g(n) ∈ O(f (n)), allora g(n) cresce al più come f (n)
• se una funzione g(n) ∈ Ω(f (n)), allora g(n) cresce almeno come f (n)
• se una funzione g(n) ∈ Θ(f (n)) , allora g(n) cresce esattamente comef (n)
• Questa analisi può essere usata per esprimere delimitazioni inferiori e superiori della
complessità di un problema
6
Fase Realizzativa
• Progettare un algoritmo è solo il primo passo
• nell’implementazione reale ci sono in genere più dettagli non specificati nello
pseudocodice
• occorre effettuare scelte ponderate che possono avere un impatto cruciale sui
tempi di esecuzione
• L’implementazione va collaudata per poter verificare eventuali errori e analizzata
sperimentalmente (possibilmente su dati reali)
• l’analisi sperimentale va utilizzata come raffinamento dell’analisi teorica
• particolare attenzione va data all’impianto sperimentale usato
7
Impianto sperimentale
• La piattaforma usata può influenzare i risultati dei test
• La qualità del codice quando si tratta di algoritmi approssimati (che forniscono
risultati in minor tempo rispetto ad algoritmi esatti)
• La misurazione dei tempi può essere effettuata con diversi livelli di granularità
• orologio di sistema
• funzioni di sistema che isolano il tempo di un singolo processo
• utilizzare un profiler
• Gli insiemi di dati di test possono influire sui risultati portando a conclusioni non
generali
• La riproducibilità dei risultati è fondamentale: piattaforma hardware e software,
misurazione dei tempi e dati di test devono consentire la riproducibilità delle
misurazioni
8
Fase Realizzativa
• L’ingegnerizzazione di un algoritmo si riferisce al trsformare la descrizione di alto
livello di un algoritmo in una implementazione robusta, efficiente, modulare, ben
testata e facilmente utilizzabile
• Ingegnerizzare comporta decidere l’organizzazione e le modalità di accesso ai dati
9
Implementare in java
• Usiamo per le nostre implementazioni il linguaggio Java
• Implementazioni differenti devono usare la stessa interfaccia in modo da rendere il
codice “intercambiabile”
• In java utilizzo di interface e diverse implementazioni
• possibilità di usare il polimorfismo nell’uso dell’algoritmo
• Uso del “boxing”, ossia incapsulare tipi primitivi in classi wrapper (Integer, Float,
Double, ...) [NB: Java 1.5 supporta boxing e unboxing in maniera trasparente]
• Confronto tramite il metodo equals: ereditato da Object deve essere ridefinito in
modo da valutare l’uguaglianza
10
Implementare in java
• Ordinamento naturale eseguito con compareTo ereditato dall’interfaccia
Comparable
• a.compareTo(b) è negativo se a “è minore” di b
• a.compareTo(b) è zero se a “è uguale” a b
• a.compareTo(b) è positivo se a “è maggiore” di b
• Se una classe implementa Comparable diciamo che sui suoi oggetti è definito un
ordinamento naturale
• Situazioni di errore dovute al mancato rispetto di precondizioni per l’esecuzione
vanno gestite con le eccezioni
• gestione di eventi anomali durante l’esecuzione di un programma
• Per passare in rassegna elementi di una collezione utilizzeremo gli iteratori. Questo
permette di ottenere, uno alla volta, tutti gli elementi della collezione
• Ogni classe che rappresenta collezioni di elementi dovrebbe implementare
l’interfaccia Iterable quindi il metodo iterator
11
Java Collections Framework
• Raggruppato nel package java.util fornisce il supporto per manipolare collezioni
di oggetti, oltre che algoritmi per ordinamento e ricerca.
• Il nucleo principale fornisce :
• Collection Interfaces (Collection, Set, List, ...)
• General-Purpose Implementations (ArrayList, LinkedList, ...)
• Algorithms (metodi statici per ordinamento e ricerca)
• Infrastructures (classi e interfacce di supporto, Comparable, Iterable, ...)
12
Riferimenti
• [DPFI07] §1 - Algoritmi e loro implementazione in Java
Quest'opera è stata rilasciata sotto la licenza Creative Commons Attribuzione-Non commerciale-Condividi allo stesso modo 2.5 Italia.
13 Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-nc-sa/2.5/it/ o spedisci una lettera a
Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
0 comments
Post a comment