UniTO/anno2/YearI/SecondSem/AC/lesson1-28022018.md
Francesco Mecca 5e286062f8 MCAD 2019
2018-11-22 13:09:11 +01:00

49 lines
2.6 KiB
Markdown

# Algoritmi e Complessita'
Esame: seminario algoritmo/argomento teorico + esame orale (leggero, a meno che non si riesca a fare la presentazione).
## Introduzione
Panoramica su tecniche algoritmiche. Studio di complessita' e limiti di applicabilita'.
### Procedimento automatico
Risoluzione di problemi utilizzando dati in input e restituendo dati in output. Risorse limitate, ci si basa sulla macchina registri (asciando da parte lambda calculus). Programmazione imperativa.
*(vedi slides per linguaggio di disegno, pseudolinguaggio utilizzato per descrivere algoritmi nel corso)*
### Complessita'
Lo studio e' relativo principalmente alla complessita' nel tempo, soluzione classica: complessita' **asintotica** (notazione *O(f(n))*, *o(f(n))*, *theta(f(n))* che significa sia *O* sia *o* di *f(n)*, moltiplicata per due costanti *c1* e *c2* ).
Importante e' la differenza tra algoritmi polinomiali (n, n^2, nlog(n), ...) e algoritmi **esponenziali** (a^n), che si rivelano molto limitati rispetto ai polinomiali (a causa del tempo richiesto vs. crescita del dataset).
### Ottimizzazione
I problemi di computazione in cui i dati sono **finitamente rappresentabili** richiedono spesso **ottimizzazione discreta** (per trovare il risultato *migliore/ottimale*).
### Problemi NP-difficult
Molti problemi (commesso viaggiatore, ciclo hamiltoniano, etc) sono **NP-difficili**, per cui quindi il tempo di esecuzione e' ***almeno esponenziale***. Spesso, per ridurre il problema a polinomiale, si deve:
* ridurre il tipo di dati in input (classi di input per cui funziona in polinomiale).
oppure:
* accettare che si possa richiedere un gran numero (infinito) di risorse per un determinato problema.
* accettare **risultati approssimati** (il risultato migliore restituito potrebbe non essere il miglore in assoluto). Questo include anche **algoritmi probabilistici**, che restituiscono risultati esatti **con una certa probabilita'**. (es: Test di Primarieta').
Da questo deriva il problema P==NP.
### Tecniche algoritmiche principali
* Greedy (sempre scelta localmente ottima)
* Divide-et-Impera (scomposizione in sottoproblemi con approccio top-down)
* Programmazione dinamica (come d-e-i, ma **bottom up** da sottoproblemi potenzialmente ripetuti)
* Backtracking (spesso esponenziale)
* Ricerca locale (migliorare soluzioni esistenti non ottime)
#### Soluzioni a problemi complessi (NP)
* Approssimazione (risultati approssimati)
* Randomizzazione (algoritmi probabilistici o randomizzati)
* Algoritmi Genetici / Simulated annealing / Ricerca Tabu' (per problemi di ottimizzazione combinatoria, *meta-algoritmi*)