Per semplicità, inizierò considerando solo i problemi di "decisione", che hanno una risposta sì / no. I problemi di funzione funzionano più o meno allo stesso modo, tranne che invece di sì / no, è presente una parola di output specifica associata a ciascuna parola di input.
Lingua : una lingua è semplicemente un insieme di stringhe. Se hai un alfabeto, come
, allora Σ ∗ è l'insieme di tutte le parole che contengono solo i simboli in Σ . Ad esempio, { 0 , 1 } ∗ΣΣ∗Σ{0,1}∗ è l'insieme di tutte le sequenze binarie di qualsiasi lunghezza. Tuttavia, non è necessario che un alfabeto sia binario. Può essere unario, ternario, ecc.
Una lingua sopra un alfabeto è un sottoinsieme di Σ ∗ .ΣΣ∗
Problema : un problema è una domanda su alcuni input a cui vorremmo ricevere una risposta. In particolare, un problema di decisione è una domanda che pone: "Il nostro dato input soddisfa la proprietà ?X
Una lingua è la realizzazione formale di un problema. Quando vogliamo ragionare teoricamente su un problema decisionale, esaminiamo spesso la lingua corrispondente. Per un problema , la lingua corrispondente è:X
è la codifica di un input y per il problema X e la risposta per input y per il problema X è "Sì" }L={w∣wyXyX}
Determinare se la risposta per un input a un problema di decisione è "sì" equivale a determinare se una codifica di quell'input su un alfabeto è nella lingua corrispondente.
Algoritmo : un algoritmo è un modo passo-passo per risolvere un problema. Si noti che un algoritmo può essere espresso in molti modi e in molte lingue e che ci sono molti algoritmi diversi che risolvono un determinato problema.
Turing Machine : una Turing Machine è l'analogo formale di un algoritmo. Una macchina di Turing su un dato alfabeto, per ogni parola, si fermerà o non si fermerà in uno stato accettante. Pertanto, per ogni Turing Machine , esiste una lingua corrispondente:M
arresta in uno stato accettante sull'input w } .L(M)={w∣Mw}
(C'è una sottile differenza tra le macchine di Turing che si fermano su tutti gli ingressi e si fermano su ingressi sì, che definisce la differenza tra le classi di complessità e R E. )RRE
La relazione tra le lingue e le macchine di Turing è la seguente
Ogni macchina Turing accetta esattamente una lingua
Potrebbe esserci più di una Turing Machine che accetta una determinata lingua
Potrebbe non esserci nessun Turing Machine che accetta una determinata lingua.
Possiamo dire all'incirca la stessa cosa su algoritmi e problemi: ogni algoritmo risolve un singolo problema, ma possono esserci 0 o molti algoritmi che risolvono un determinato problema.
Complessità temporale : una delle più comuni fonti di confusione tra algoritmi e problemi riguarda le classi di complessità. L'allocazione corretta può essere sintetizzata come segue:
- Un algoritmo ha una complessità temporale
- Un problema appartiene a una classe di complessità
Un algoritmo può avere una certa complessità temporale. Diciamo che un algoritmo ha una complessità nel limite superiore caso peggiore
se l'algoritmo si ferma al massimo f ( n ) passi per qualsiasi input di dimensione n .f(n)f(n)n
I problemi non hanno tempi di esecuzione, poiché un problema non è legato a un algoritmo specifico che viene effettivamente eseguito. Invece, diciamo che un problema appartiene a una classe di complessità, se esiste un algoritmo che risolve quel problema con una data complessità temporale.
P,NP,PSPACE,EXPTIME etc. are all complexity classes. This means they contain problems, not algorithms. An algorithm can never be in P, but if there's a polynomial-time algorithm solving a given problem X, then X is in P. There could also be a bunch of exponential-time algorithms accepting X, but since there exists a single polynomial-time algorithm accepting X, it is in P.