1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-11-29 03:14:19 +00:00
triennale-appunti-steffo/public/materials/year1/algoritmi/05_ProblemiAlgoritmici.md

2.3 KiB

Problemi algoritmici

Un problema algoritmico è un problema matematico che si vuole provare a risolvere con un algoritmo.

Dati 10 numeri, voglio sapere se sono in ordine crescente oppure no.

Caterigorizzazione

I problemi algoritmici si dividono in tre categorie: problemi trattabili, problemi intrattabili e problemi irrisolvibili.

Problema trattabile

Perchè un problema algoritmico sia trattabile, deve avere almeno un algoritmo con upper bound polinomiale.

Questo significa che il tempo impiegato da un computer per risolvere il problema rimane ragionevole, e che quindi può essere utilizzato in maniera efficiente.

La trattabilità è un campo ancora parecchio aperto: esistono anche tanti problemi di cui non si è ancora dimostrata la trattabilità o intrattabilità.

La fattorizzazione è uno di questi problemi: l'assenza di una dimostrazione è ciò che la rende uno dei pilastri della sicurezza informatica moderna.

Problema intrattabile

Se un problema non ha nessun algoritmo con upper bound polinomiale, allora si dice che è intrattabile.

Problema irrisolvibile

Se non esistono algoritmi per risolvere un problema, allora questo si dice irrisolvibile.

Dato un algoritmo con certi input, riusciamo a capire con un algoritmo se la sua esecuzione termina o no?

Upper e lower bound di problemi

Si può anche trovare un upper bound e un lower bound per un problema, ma bisogna generalizzare di più.

L'upper bound di un problema è il minimo upper bound di tutti gli algoritmi che lo risolvono; deve esistere almeno un algoritmo che lo risolva che abbia lo stesso upper bound. E' praticamente il tempo migliore per risolvere il problema dato.

Il lower bound di un problema è il minimo lower bound di tutti gli algoritmi che lo risolvono; non deve esistere nemmeno un algoritmo che abbia un lower bound migliore. E' il numero assolutamente minimo di operazioni richieste, non si può fare meglio di così.

In particolare, abbiamo che l'upper bound di un algoritmo -> l'upper bound del suo problema,
e il lower bound di un problema -> il lower bound di un suo algoritmo.

Generalmente, il lower bound di un problema è una rappresentazione abbastanza accurata della sua difficoltà.