1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-11-24 11:14:18 +00:00
appunti-steffo/2 - Algoritmi e strutture dati/1 - Appunti/01 - Il nome del corso.md

44 lines
2.2 KiB
Markdown
Raw Normal View History

# 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.