|
Article on other languages:
|
In informatica, la teoria della complessità algoritmica o teoria della complessità computazionale è una branca della teoria della computabilità che studia le risorse minime necessarie (principalmente tempo di calcolo e memoria) per la risoluzione di un problema. I problemi vengono così classificati in differenti classi di complessità, a seconda di quanto il migliore algoritmo di risoluzione noto sia efficiente. Una distinzione informale ma di grande rilievo è quella posta tra i cosiddetti problemi facili, di cui si conoscono algoritmi di risoluzione efficienti, e difficili, di cui gli unici algoritmi noti non sono efficienti. La maggior parte della crittografia moderna si fonda sull'esistenza di problemi ritenuti difficili; ciò pone un'enorme rilevanza allo studio di tali problemi, poiché, qualora si dimostrasse l'esistenza di un algoritmo efficiente per un problema ritenuto difficile, i sistemi crittografici basati su di esso non sarebbero più sicuri. Con complessità di un algoritmo o efficienza di un algoritmo ci si riferisce alle risorse di calcolo da esso richieste.
Misurazione delle risorse
Per misurare l'efficienza di un algoritmo in maniera univoca, bisogna definire una metrica che sia indipendente dalle tecnologie utilizzate, altrimenti uno stesso algoritmo potrebbe avere efficienza diversa a seconda della tecnologia sulla quale viene eseguito. Per questo motivo si usa fare riferimento ad un modello di calcolo generico: la macchina di Turing. Si dimostra che qualunque modello di calcolo scelto (come ad esempio la macchina RAM, ma si può parlare anche di computer reali), ai fini della classificazione dei problemi, si comporta come la macchina di Turing. Per quel che riguarda la misurazione della risorsa tempo, data una macchina di Turing M, si dice che M opera in tempo f(n) se dato un input x di lunghezza n, la macchina M produce il risultato in f(n) passi. Per quel che riguarda la misurazione della risorsa spazio, data una macchina di Turing M, si dice che M opera in spazio f(n) se dato un input x di lunghezza n, la macchina M utilizza f(n) celle "temporanee" per effettuare la computazione. Per temporanee si intende che la dimensione dell'input e la dimensione dell'output non vengono conteggiate in f(n). Si osservi che, affinché queste affermazioni siano valide, f(n) dev'essere una funzione di complessità propria, cioè deve soddisfare le seguenti condizioni:
Poiché questo tipo di misurazione è molto dettagliata, quindi di solito difficilmente applicabile alla realtà, si introducono delle approssimazioni che permettono di operare su algoritmi più astratti. In particolare si ricorre alla notazione
La funzione f(n) da un certo n in poi cresce al più come la funzione g(n). Per fare un esempio, Per valutare le prestazioni di un algoritmo, solo in parte legate alla classificazione di un problema, è utile distinguere alcuni casi: si considerano il caso ottimo, il caso peggiore e il caso medio.
In questo ambito tornano dunque utili altre due misure, complementari della notazione O grande:
Classi di complessità
Partendo dalla misurazione delle risorse computazionali si possono definire le classi di complessità:
Per tutte le classi definite sopra si dimostra che, grazie all'uso della macchina di Turing come modello di calcolo, l'utilizzo della notazione O grande all'interno della definizione non cambia il risultato. In questo modo, ad esempio, TIME(f(n)) = TIME(O(f(n))). Possiamo così definire le seguenti classi di complessità:
Tra queste classi sono note le seguenti relazioni di equivalenza: Altre relazioni non sono note. L'implicazione pratica principale data da questa classificazione è la suddivisione in problemi che sappiamo risolvere in modo efficiente e in problemi che non sappiamo se possono essere risolti in modo efficiente. Infatti, calcolare il caso ottimo di un algoritmo di solito non è un'operazione troppo complicata, però ciò che è molto difficile dire è che un certo algoritmo è il migliore possibile per un certo problema. Dimostrazioni di questo tipo sono molto rare, la più nota è senz'altro quella riguardante l'ordinamento per confronto. Data questa premessa, osserviamo che se sappiamo che un certo problema Problemi NP-completiQuando il problema P è uguale a NP? è stato formulato nel 1971 se ne intravedeva la soluzione dietro l'angolo, tuttavia dopo più di trent'anni di studi la questione è ancora aperta, ed essendo considerato uno dei problemi per il millennio la sua soluzione permetterebbe di vincere un milione di dollari USA (v. premio Clay). Gli unici passi avanti che si sono fatti riguardano la classificazione dei problemi. La strada che si è seguita è stata osservare che molti dei problemi che stavano nella classe NP seguivano una stessa struttura: la costruzione della soluzione con un algoritmo non deterministico e la verifica della soluzione costruita con un algoritmo deterministico. Ci si chiedeva quindi se ci fosse un denominatore comune in questi problemi, e in effetti c'era: ci si è accorti che esistono dei problemi tali che un algoritmo per risolvere uno di questi problemi può essere convertito in un algoritmo per risolvere un qualunque problema NP. Questi problemi sono stati detti NP-difficili (NP-hard). Un problema NP-difficile potrebbe anche non stare in NP, nel senso che la verifica della soluzione (o equivalentemente l'"algoritmo di Gastone") potrebbe richiedere un tempo più che polinomiale. Riduzione in spazio logaritmicoPer dimostrare questa sorta di equivalenza, ci si riconduce alla teoria dei linguaggi, e si sfrutta il concetto di riduzione. Formalmente:
In particolare, si sfrutta la riduzione in spazio logaritmico (simbolo
La riduzione "in spazio logaritmico" è una riduzione che, oltre alle proprietà appena elencate, ha la caratteristica di essere calcolabile da una macchina di Turing che opera in spazio logaritmico, ed è grazie a questo che si dimostra la sua transitività. NP-completezza
Alla luce di queste definizioni, si può dire che un problema Π è NP-difficile se Con l'obiettivo di dimostrare l'uguaglianza P = NP, si cominciò a cercare un algoritmo polinomiale per la soluzione di uno qualunque dei problemi NP-completi: questo avrebbe automaticamente fatto collassare tutta la classe di problemi NP nella classe P. Nessuno è riuscito a trovarne uno, né nessuno è mai riuscito a dimostrare che ApprossimabilitàSpin glass e K-solvibilitàBibliografia
Voci correlate
Collegamenti esterni
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net