mirror of
https://github.com/Steffo99/appunti-magistrali.git
synced 2024-11-22 10:44:17 +00:00
44 lines
2.2 KiB
Markdown
44 lines
2.2 KiB
Markdown
|
# Il nome del corso
|
||
|
|
||
|
## Cosa sono gli algoritmi?
|
||
|
|
||
|
Gli algoritmi sono modi sistematici per risolvere problemi.
|
||
|
|
||
|
Sono fondamentali per sviluppare software, in quanto i computer sono eccellenti esecutori di algoritmi.
|
||
|
|
||
|
## Come si sviluppa un algoritmo?
|
||
|
|
||
|
Innanzitutto, bisogna conoscere gli _input_ e gli _output_ del problema, rispettivamente i dati di partenza e i dati di arrivo di esso; si ha quindi una fase di **ricerca**.
|
||
|
|
||
|
Poi, si deve trovare un procedimento che ci faccia risolvere il nostro problema: è quello che faremo in questa materia!
|
||
|
|
||
|
Infine, bisogna scrivere la soluzione in un modo che possa essere eseguita da un computer: questa è la **programmazione**.
|
||
|
|
||
|
## Che tipo di problemi possiamo risolvere?
|
||
|
|
||
|
Un algoritmo risolve problemi di tipo generale, non ci interessa sapere _il risultato di 123+456_, ma vogliamo sapere _il risultato di x+y_, dove x e y sono due numeri naturali qualsiasi.
|
||
|
|
||
|
Un problema può essere quindi considerato circa come una **funzione matematica**, che connette ogni input a un output corrispondente.
|
||
|
|
||
|
## Che caratteristiche ha un algoritmo?
|
||
|
|
||
|
Per prima cosa, ripetendo l'algoritmo più volte con lo stesso ingresso deve dare sempre la stessa uscita come **risultato**, finendo in un **tempo finito**.
|
||
|
|
||
|
Deve essere **ben ordinato**: cambiando l'ordine in cui vengono effettuate le operazioni, è probabile che anche il risultato cambi!
|
||
|
|
||
|
Le sue istruzioni devono essere **non ambigue**, cioè che non possano essere interpretate in più modi, e **effettivamente realizzabili**, cioè realizzabili con l'esecutore che vogliamo usare per eseguire l'algoritmo.
|
||
|
|
||
|
## Esistono algoritmi equivalenti?
|
||
|
|
||
|
**Sì!** Possono esserci due algoritmi che dati gli stessi input, hanno gli stessi output, e quindi risolvono lo stesso problema.
|
||
|
|
||
|
In compenso, possono avere un numero di operazioni diverse, e quindi essere **uno più veloce** (da eseguire) dell'altro.
|
||
|
|
||
|
## Come si verifica la correttezza di un algoritmo?
|
||
|
|
||
|
L'algoritmo deve essere **valido per tutti gli input**, anche se questi sono infiniti.
|
||
|
|
||
|
Possiamo effettuare prove matematiche per verificarne la correttezza; il **principio di induzione** è dunque una dei teoremi fondamentali dell'algoritmica.
|
||
|
|
||
|
Possiamo però verificare la _non correttezza_ di un algoritmo trovando un singolo controesempio.
|