Cercando di capire P vs NP vs NP Complete vs NP Hard


38

Sto cercando di capire queste classificazioni e perché esistono. La mia comprensione è giusta? Se no, cosa?

  1. P è la complessità polinomiale o per un numero reale non negativo , come , ecc. Se un problema appartiene a P, allora esiste almeno un algoritmo che può risolverlo da zero in tempo polinomiale. Ad esempio, posso sempre capire se un numero intero è primo eseguendo il loop e controllando ad ogni passaggio se si divide .O(nk)kO(1), O(n1/2), O(n2), O(n3)n2 <= k <= sqrt(n)kn

  2. NP è una complessità polinomiale non deterministica. Non so davvero cosa significhi che non sia deterministico. Penso che significhi che è facile verificarlo in tempo polinomiale, ma potrebbe essere o meno il tempo polinomiale per risolvere da zero se non sapessimo già la risposta. Poiché può essere risolvibile in tempi polinomiali, tutti i problemi di P sono anche problemi di NP. La fattorizzazione in numeri interi viene citata come esempio di NP, ma non capisco perché non sia P, personalmente, poiché la fattorizzazione in prova richiede O(sqrt(n))tempo.

  3. NP-Complete Non capisco affatto, ma il Problema del commesso viaggiatore è citato come esempio di questo. Ma a mio avviso il problema TSP potrebbe essere solo NP, perché ci vuole qualcosa di simile per verificare se ti viene dato il percorso in anticipo.O(2n n2) time to solve, but O(n)

  4. NP-Hard Presumo sia solo pieno di incognite. Difficile da verificare, difficile da risolvere.



Non ho ancora visto quel link, no. Lo rileggerò, grazie
Nakano,

1
Quella risposta CS.SE è piuttosto impressionante, ma penso che sia possibile dare una spiegazione molto concisa e non fuorviante di cosa significano questi termini senza entrare in troppi dettagli. @Nakano sarebbe interessato a una risposta "al punto" più breve o quel post CS.SE risolve il tuo problema?
Ixrec,

@MichaelT Ho letto quel link e l'ho trovato davvero dettagliato e non molto chiaro su diversi punti. Sento che mi ha dato solo più domande che risposte.
Nakano,

1
"non deterministico" può essere interpretato come "data una scelta il computer sceglie sempre la scelta corretta".
Thorbjørn Ravn Andersen,

Risposte:


40

In pratica hai ragione su P e NP, ma non su NP-hard e NP-complete.

Per i principianti, ecco le definizioni super concise delle quattro classi di complessità in questione:

  • P è la classe di problemi di decisione che possono essere risolti in tempo polinomiale da una macchina di Turing deterministica.

  • NP è la classe di problemi decisionali che possono essere risolti in tempi polinomiali da una macchina di Turing non deterministica. Equivalentemente, è la classe di problemi che può essere verificata in tempo polinomiale da una macchina di Turing deterministica.

  • NP-hard è la classe di problemi decisionali a cui tutti i problemi in NP possono essere ridotti in tempi polinomiali da una macchina di Turing deterministica.

  • NP-complete è l'intersezione di NP-hard e NP. Equivalentemente, NP-complete è la classe di problemi decisionali in NP a cui tutti i problemi in NP possono essere ridotti in tempo polinomiale da una macchina di Turing deterministica.

Ed ecco un diagramma di Eulero di Wikipedia che mostra le relazioni tra queste quattro classi (supponendo che P non sia uguale a NP):

inserisci qui la descrizione dell'immagine

La parte che presumo che tu non abbia familiarità o confusione con la nozione di "riduzione del tempo polinomiale" dal problema X al problema Y. Una riduzione da X a Y è semplicemente un algoritmo A che risolve X facendo uso di alcuni altro algoritmo B che risolve il problema Y. Questa riduzione è chiamata "riduzione del tempo polinomiale" se tutte le parti di A diverse da B hanno una complessità temporale polinomiale. Come esempio banale, il problema di trovare l'elemento più piccolo in un array è riducibile a tempo costante al problema di ordinamento, poiché è possibile ordinare l'array e quindi restituire il primo elemento dell'array ordinato.

Una cosa che è facile perdere nella definizione NP-hard è che la riduzione va dai problemi NP al problema NP-hard, ma non necessariamente viceversa . Ciò significa che i problemi NP-difficili potrebbero trovarsi in NP, o in una classe di complessità molto più elevata (come puoi vedere dal diagramma di Eulero), oppure potrebbero non essere nemmeno problemi decidibili. Ecco perché le persone spesso dicono qualcosa come "NP-hard significa almeno quanto NP" quando cercano di spiegare queste cose in modo informale.

Il problema di arresto è un buon esempio di un problema NP-difficile che chiaramente non è in NP, come spiega Wikipedia :

È facile dimostrare che il problema di arresto è NP-difficile ma non NP-completo. Ad esempio, il problema della soddisfacibilità booleana può essere ridotto al problema dell'arresto trasformandolo nella descrizione di una macchina di Turing che tenta tutte le assegnazioni di valori di verità e quando ne trova una che soddisfa la formula si ferma e altrimenti va in un ciclo infinito. È anche facile vedere che il problema dell'arresto non è in NP poiché tutti i problemi nell'NP sono decidibili in un numero finito di operazioni, mentre il problema dell'arresto, in generale, è indecidibile.


3
@Nakano Intuitivamente, è una "riduzione", nel senso che un problema è diventato un sottoproblema di qualche altro problema. Il fatto che alcune di queste riduzioni aumentino la complessità invece di ridurla a causa di una cattiva scelta del "sottoproblema" significa semplicemente che non usereste mai queste riduzioni in nessun codice del mondo reale. Anche se ad essere sincero NP-difficile mi sembra una classe strana e non terribilmente interessante; può essere più fruttuoso ignorarlo e pensare a NP-complete come l'insieme di problemi NP a cui tutti gli altri problemi NP si riducono.
Ixrec,

1
@Nakano stackoverflow.com/questions/12637582/... Credo che la risposta breve è che quando si parla di fattorizzazione di interi essere NP stanno normalmente parlando davvero enormi numeri interi, per i quali in genere si inizia a fare le vostre prove O grande con n come "il numero di bit occupati dall'intero in memoria" anziché "il numero di numeri interi passati nella funzione".
Ixrec,

1
@Nakano Probabilmente varrebbe la pena porre una nuova domanda specificamente su questa cosa di fattorizzazione a numeri interi se la domanda SO che ho collegato e il mio commento non fossero sufficienti per risolvere il problema per te.
Ixrec,

2
@Nakano: nella notazione big-O, nè una misura per la dimensione dell'input (numero di elementi, byte, cifre, ecc.), Non per il valore dell'input.
Bart van Ingen Schenau,

2
@Nakano La risposta breve è che stai bene, ed è per questo che quando fai un'analisi della complessità del tempo devi sempre specificare cosa significa n . L'affermazione che n è "la dimensione dell'input" è semplicemente un breve riassunto di come normalmente scegliamo di definire n. Non fa parte delle rigorose definizioni di notazione big-O o complessità temporale. Credo che tu abbia ragione a dire che la fattorizzazione dei numeri interi è O (sqrt (n)) quando n è il valore dell'input. Accade così che la complessità risulta in cui n significa dimensione in genere è molto più utile in pratica di quelli in cui n significa valore.
Ixrec,

7

La fattorizzazione in numeri interi viene citata come esempio di NP, ma non capisco perché non sia P, personalmente, poiché la fattorizzazione in prova richiede tempo O (sqrt (n)).

Ai fini delle classi di complessità, nè la lunghezza dell'input. Quindi, se si desidera fattorizzare un numero intero k, nnon è kche log kil numero di bit (o qualsiasi altra cosa) per scrivere il numero. Quindi la fattorizzazione dei numeri interi è O(sqrt(k))come dici tu, ma questo è quello che è .O(sqrt(2n))O(2(n/2))

NP-Hard Presumo sia solo pieno di incognite. Difficile da verificare, difficile da risolvere.

No. NP-Hard riguarda semplicemente la difficoltà di risolvere un problema.

I problemi NP-Hard sono almeno difficili come il problema più difficile in NP. Sappiamo che sono almeno così difficili, perché se avessimo un algoritmo a tempo polinomiale per un problema NP-Hard, potremmo adattare tale algoritmo a qualsiasi problema in NP.

NP-Complete Non capisco affatto

NP-Complete significa che un problema è sia NP che NP-Hard. Significa che possiamo verificare rapidamente una soluzione (NP), ma è almeno tanto difficile quanto il problema più difficile in NP (NP-Hard).

Non so davvero cosa significhi che non sia deterministico.

Il non determinismo è una definizione alternativa di NP. Una macchina di turing non deterministica è effettivamente in grado di duplicarsi in qualsiasi momento e fare in modo che ogni duplicato abbia un percorso di esecuzione diverso. In base a questa definizione, NP è l'insieme dei problemi che possono essere risolti in un tempo polinomiale da un computer che può duplicarsi liberamente. Si scopre che questo è esattamente lo stesso insieme di problemi che possono essere verificati in tempo polinomiale.


Quindi è possibile che gli algoritmi $ O (n ^ k) $ siano problemi NP?
Nakano,

kè un numero reale costante? Sì. Tutti i problemi P sono anche problemi NP. Ovviamente, tutto ciò che puoi risolvere in tempo polinomiale può anche essere verificato in tempo polinomiale.
Winston Ewert,

Come vengono effettivamente definite lunghezza / dimensione qui? Ad esempio, potrei semplicemente scrivere $ n $ in una base di grandi dimensioni e ridurne la lunghezza durante la scrittura. Che dire dei problemi che non si occupano esplicitamente di numeri interi, ma che dicono grafici con vertici $ V $ e bordi $ E $, ecc.
Nakano,

@Nakano, in realtà una grande base non lo cambierebbe, perché sarebbe solo una differenza di fattore costante. Quindi non avrebbe effetto polinomiale vs non polinomiale. Tuttavia, se scrivessi il numero in unario, lo cambierebbe.
Winston Ewert,

2
@Nakano, hmm ... Non oserei provare a spiegare le classi di complessità a un bambino di cinque anni. : P
Winston Ewert,

6

La prima cosa da capire è che P e NP classificano le lingue , non i problemi . Per capire cosa significhi, abbiamo prima bisogno di alcune altre definizioni.

Un alfabeto è un insieme finito di simboli non vuoto.

{ 0, 1} è un alfabeto così come il set di caratteri ASCII. {} non è un alfabeto perché è vuoto. N (numeri interi) non è un alfabeto perché non è finito.

Sia Σ un alfabeto. Una concatenazione ordinata di un numero finito di simboli da Σ è chiamata parola sopra Σ .

La stringa 101è una parola sopra l'alfabeto { 0, 1}. La parola vuota (spesso scritta come ε ) è una parola su qualsiasi alfabeto. La stringa penguinè una parola sopra l'alfabeto contenente i caratteri ASCII. La notazione decimale del numero π non è una parola sopra l'alfabeto { ., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9} perché non è finita.

La lunghezza di una parola w , scritta come | w |, è il numero di simboli in essa contenuti.

Ad esempio, | hello| = 5 e | ε | = 0. Per ogni parola w , | w | ∈ N e quindi finito.

Sia Σ un alfabeto. L'insieme Σ contiene tutte le parole sopra Σ , incluso ε . L'insieme Σ + contiene tutte le parole sopra Σ , escluso ε . Per nN , Σ n è l'insieme di parole di lunghezza n .

Per ogni alfabeto Σ , Σ e Σ + sono insiemi numerabili infiniti . Per il set di caratteri ASCII Σ ASCII , le espressioni regolari .*e .+denotano Σ ASCII * e Σ ASCII + rispettivamente.

{ 0, 1} 7 è l'insieme di codici ASCII a 7 bit { 0000000, 0000001, ..., 1111111}. { 0, 1} 32 è l'insieme di valori interi a 32 bit.

Sia Σ un alfabeto e LΣ . L è chiamata lingua sopra Σ .

Per un alfabeto Σ , l'insieme vuoto e Σ * sono lingue banali oltre Σ . Il primo viene spesso definito linguaggio vuoto . La lingua vuota {} e la lingua contenente solo la parola vuota { ε } sono diverse.

Il sottoinsieme di { 0, 1} 32 che corrisponde a valori in virgola mobile IEEE 754 non NaN è un linguaggio finito.

Le lingue possono avere un numero infinito di parole ma ogni lingua è numerabile. L'insieme di stringhe { 1, 2...} che denota i numeri interi in notazione decimale è un linguaggio infinita sopra l'alfabeto { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. L'insieme infinito di stringhe { 2, 3, 5, 7, 11, 13, ...} che denota i numeri primi in notazione decimale è un sottoinsieme corretto della stessa. Il linguaggio che contiene tutte le parole che corrispondono all'espressione regolare [+-]?\d+\.\d*([eE][+-]?\d+)?è un linguaggio sul set di caratteri ASCII (che indica un sottoinsieme delle espressioni in virgola mobile valide definite dal linguaggio di programmazione C).

Non esiste un linguaggio che contenga tutti i numeri reali (in nessuna notazione) perché l'insieme dei numeri reali non è numerabile.

Sia Σ un alfabeto e LΣ . Una macchina D decide L se per ogni input wΣ calcola la funzione caratteristica χ L ( w ) in tempo finito. La funzione caratteristica è definita come

χ L : Σ  → {0, 1}
     w   ↦ 1,   wL 
         0, altrimenti.

Tale macchina è chiamata decisiva per L . Scriviamo “ D ( w ) = x ” per “dato w , uscite D x ”.

Esistono molti modelli di macchine. Quello più generale oggi in uso pratico è il modello di una macchina Turing . Una macchina di Turing ha memoria lineare illimitata raggruppata in celle. Ogni cella può contenere esattamente un simbolo di un alfabeto in qualsiasi momento. La macchina di Turing esegue il suo calcolo come una sequenza di fasi di calcolo. In ogni passaggio, può leggere una cella, eventualmente sovrascriverne il valore e spostare la testina di lettura / scrittura di una posizione sulla cella sinistra o destra. Quale azione eseguirà la macchina è controllata da un automa a stati finiti.

Una macchina ad accesso casuale con un set limitato di istruzioni e spazio di archiviazione illimitato è un altro modello di macchina potente quanto il modello di macchina di Turing.

Per motivi di questa discussione, non ci disturberemo con il modello di macchina preciso che usiamo, ma piuttosto basti dire che la macchina ha un'unità di controllo deterministica finita, memoria illimitata ed esegue un calcolo come una sequenza di passi che possono essere contati.

Dato che l'hai usato nella tua domanda, presumo che tu abbia già familiarità con la notazione "big-O", quindi ecco solo un rapido aggiornamento.

Sia f : N → una funzione. L'insieme O ( f ) contiene tutte le funzioni g : NN per le quali esistono costanti n 0N e cN tali che per ogni nN con n > n 0 è vero che g ( n ) ≤ c f ( n ).

Ora siamo pronti ad affrontare la vera domanda.

La classe P contiene tutte le lingue L per le quali esiste una macchina di Turing D che decide L e una costante kN tale che per ogni input w , D si ferma dopo al massimo T (| w |) passi per una funzione TO ( nn k ).

Poiché O ( nn k ), sebbene matematicamente corretto, è scomodo da scrivere e leggere, la maggior parte delle persone - a dire il vero, tutti tranne me stesso - di solito scrive semplicemente O ( n k ).

Si noti che il limite dipende dalla lunghezza di w . Pertanto, l'argomento che fai per il linguaggio dei numeri primi è corretto solo per i numeri nelle codifiche unaray , dove per la codifica w di un numero n , la lunghezza della codifica | w | è proporzionale a n . Nessuno userebbe mai tale codifica in pratica. Utilizzando un algoritmo più avanzato del semplice tentativo di provare tutti i possibili fattori, si può dimostrare, tuttavia, che il linguaggio dei numeri primi rimane in P se gli input sono codificati in binario (o su qualsiasi altra base). (Nonostante il grande interesse, questo potrebbe essere dimostrato solo da Manindra Agrawal, Neeraj Kayal e Nitin Saxena in un documento pluripremiato del 2004, quindi puoi immaginare che l'algoritmo non sia molto semplice.)

I linguaggi banali {} e Σ e il linguaggio non banale { ε } sono ovviamente in P (per qualsiasi alfabeto Σ ). Riesci a scrivere funzioni nel tuo linguaggio di programmazione preferito che prendono una stringa come input e restituiscono un valore booleano che dice se la stringa è una parola dalla lingua per ognuna di queste e dimostra che la tua funzione ha una complessità runtime polinomiale?

Ogni regolare linguaggio (un linguaggio descritto da un'espressione regolare) è in P .

Sia Σ un alfabeto e LΣ . Una macchina V che accetta una tupla codificata di due parole w , cΣ e genera 0 o 1 dopo un numero finito di passi è un verificatore per L se ha le seguenti proprietà.

  • Data ( w , c ), V uscite 1 solo se wL .
  • Per ogni wL , esiste una cΣ tale che V ( w , c ) = 1.

La c nella definizione sopra è chiamata testimone (o certificato ).

Un verificatore è autorizzato a dare falsi negativi per la testimonianza sbagliato anche se w in realtà è in L . Non è tuttavia consentito dare falsi positivi. È inoltre richiesto che per ogni parola nella lingua esista almeno un testimone.

Per il linguaggio COMPOSITO, che contiene le codifiche decimali di tutti i numeri interi che non sono primi, un testimone potrebbe essere una fattorizzazione. Ad esempio, (659, 709)è testimone di 467231∈ COMPOSITO. Puoi facilmente verificare che su un foglio di carta senza il testimone dato, dimostrando che 467231 non è primo sarebbe difficile senza usare un computer.

Non abbiamo detto nulla su come trovare un testimone appropriato. Questa è la parte non deterministica.

La classe NP contiene tutte le lingue L per le quali esiste una macchina di Turing V che verifica L e una costante kN tale che per ogni input ( w , c ), V si ferma dopo al massimo T (| w |) passi per una funzione TO ( nn k ).

Si noti che la definizione di cui sopra implica che per ogni wL esiste un testimone c con | c | ≤ T (| w |). (La macchina di Turing non può assolutamente guardare più simboli del testimone.)

NP è un superset di P (perché?). Non è noto se esistono lingue che sono NP , ma non in P .

La fattorizzazione in numeri interi non è una lingua in sé. Tuttavia, possiamo costruire un linguaggio che rappresenti il problema decisionale ad esso associato. Cioè, una lingua che contiene tutte le tuple ( n , m ) tale che n ha un fattore d con dm . Chiamiamo questa lingua FATTORE. Se si dispone di un algoritmo per decidere FACTOR, può essere utilizzato per calcolare una fattorizzazione completa con un solo sovraccarico polinomiale eseguendo una ricerca binaria ricorsiva per ciascun fattore primo.

È facile dimostrare che FACTOR è in NP . Un testimone appropriato sarebbe semplicemente il fattore d stesso e tutto ciò che il verificatore dovrebbe fare è verificare che dm e n mod d = 0. Tutto ciò può essere fatto in tempo polinomiale. (Ricorda, ancora una volta, che è la lunghezza della codifica che conta e che è logaritmica in n .)

Se puoi mostrare che FACTOR è anche in P , puoi essere sicuro di ottenere molti premi interessanti. (E hai rotto una parte significativa della crittografia di oggi.)

Per ogni linguaggio in NP , esiste un algoritmo a forza bruta che lo decide in modo deterministico. Esegue semplicemente una ricerca esaustiva su tutti i testimoni. (Nota che la lunghezza massima di un testimone è limitata da un polinomio.) Quindi, il tuo algoritmo per decidere PRIMES era in realtà un algoritmo a forza bruta per decidere COMPOSITO.

Per rispondere alla tua domanda finale, dobbiamo introdurre una riduzione . Le riduzioni sono un concetto molto potente di informatica teorica. Ridurre un problema ad un altro significa fondamentalmente risolvere un problema mediante la risoluzione di un altro problema.

Sia Σ un alfabeto e A e B siano le lingue sopra Σ . A è più volte polinomiale riducibile a B se esiste una funzione f : Σ Σ con le seguenti proprietà.

  • wA   ⇔   f ( w ) ∈ B   per tutto wΣ .
  • La funzione f può essere calcolata da una macchina di Turing per ogni input w in una serie di passaggi delimitati da un polinomio in | w |.

In questo caso, scriviamo AP B .

Ad esempio, sia A il linguaggio che contiene tutti i grafici (codificati come matrice di adiacenza) che contengono un triangolo. (Un triangolo è un ciclo di lunghezza 3.) Sia B ulteriormente la lingua che contiene tutte le matrici con traccia diversa da zero. (La traccia di una matrice è la somma dei suoi principali elementi diagonali.) Quindi A è polinomiale molti-one riducibile a B . Per dimostrarlo, dobbiamo trovare una funzione di trasformazione appropriata f . In questo caso, possiamo impostare f per calcolare la terza potenza della matrice di adiacenza. Ciò richiede due prodotti matrice-matrice, ognuno dei quali presenta una complessità polinomiale.

È banalmente vero che LP L . (Puoi provarlo formalmente?)

Lo applicheremo ora a NP .

Una lingua L è NP -hard se e solo se L '≤ p L per ogni lingua L ' ∈ NP .

Una lingua di NP -hard può o meno essere nella stessa NP .

Un linguaggio L è NP -Complete se e solo se

  • LNP e
  • L è NP -hard.

Il linguaggio completo NP più famoso è SAT. Contiene tutte le formule booleane che possono essere soddisfatte. Ad esempio, ( ab ) ∧ (¬ a ∨ ¬ b ) ∈ SAT. Un testimone valido è { a = 1, b = 0}. La formula ( ab ) ∧ (¬ ab ) ∧ ¬ b ∉ SAT. (Come lo dimostreresti?)

Non è difficile dimostrare che SAT ∈ NP . Mostrare il NP -hardness di SAT è un po 'di lavoro, ma è stato fatto nel 1971 da Stephen Cook .

Una volta conosciuta una lingua completa NP , era relativamente semplice mostrare la completezza NP di altre lingue tramite riduzione. Se la lingua A è nota per essere NP -hard, allora mostrando che Ap B mostra che anche B è NP -hard (tramite la transitività di "≤ p "). Nel 1972 Richard Karp pubblicò un elenco di 21 lingue che poteva mostrare erano NP-completo tramite riduzione (transitiva) di SAT. (Questo è l'unico documento in questa risposta che consiglio vivamente di leggere. A differenza degli altri, non è difficile da capire e dà un'ottima idea di come funziona la dimostrazione della completezza NP attraverso la riduzione.)

Finalmente un breve riassunto. Useremo i simboli NPH e NPC per indicare rispettivamente le classi delle lingue complete NP -hard e NP - complete .

  • PNP
  • NPCNP e NPCNPH , in realtà NPC = NPNPH per definizione
  • ( ANP ) ∧ ( BNPH ) ⇒   Ap B

Si noti che l'inclusione NPCNP è corretta anche nel caso in cui P = NP . Per vedere questo, renditi chiaro che nessun linguaggio non banale può essere ridotto a un linguaggio banale e ci sono linguaggi banali in P e linguaggi non banali in NP . Questo è un caso angolare (non molto interessante), però.

appendice

La tua principale fonte di confusione sembra essere che stavi pensando alla " n " in " O ( nf ( n ))" come l' interpretazione dell'input di un algoritmo quando si riferisce effettivamente alla lunghezza dell'input. Questa è una distinzione importante perché significa che la complessità asintotica di un algoritmo dipende dalla codifica utilizzata per l'input.

Questa settimana è stato raggiunto un nuovo record per il più grande numero primo noto di Mersenne . Il numero primo più grande attualmente conosciuto è 2 74 207 281 - 1. Questo numero è così grande che mi dà mal di testa, quindi ne userò uno più piccolo nel seguente esempio: 2 31 - 1 = 2 147 483 647. Può essere codificato in diversi modi.

  • dal suo esponente Mersenne come numero decimale: 31(2 byte)
  • come numero decimale: 2147483647(10 byte)
  • come numero unario: 11111…11dove deve essere sostituito da 2 147 483 640 più 1s (quasi 2 GiB)

Tutte queste stringhe codificano lo stesso numero e dato uno di questi, possiamo facilmente costruire qualsiasi altra codifica dello stesso numero. (Se lo si desidera, è possibile sostituire la codifica decimale con binaria, ottale o esadecimale. Cambia la lunghezza solo con un fattore costante.)

L'algoritmo ingenuo per testare la primalità è solo polinomiale per codifiche unarie. Il test di primalità AKS è polinomiale per decimale (o qualsiasi altra base b ≥ 2). Il test di primalità di Lucas-Lehmer è l'algoritmo più noto per i numeri primi di Mersenne M p con p un numero dispari, ma è ancora esponenziale nella lunghezza della codifica binaria dell'esponente Mersenne p (polinomio in p ).

Se vogliamo parlare della complessità di un algoritmo, è molto importante che siamo molto chiari su quale rappresentazione utilizziamo. In generale, si può presumere che venga utilizzata la codifica più efficiente. Cioè, binario per numeri interi. (Nota che non tutti i numeri primi sono numeri primi di Mersenne, quindi l'uso dell'esponente Mersenne non è uno schema di codifica generale.)

Nella crittografia teorica, molti algoritmi hanno formalmente passato una stringa completamente inutile di k 1 come primo parametro. L'algoritmo non esamina mai questo parametro ma gli consente di essere formalmente polinomiale in k , che è il parametro di sicurezza utilizzato per ottimizzare la sicurezza della procedura.

Per alcuni problemi per i quali il linguaggio decisionale nella codifica binaria è NP- completo, il linguaggio decisionale non è più NP- completo se la codifica dei numeri incorporati viene commutata su unaria. Le lingue delle decisioni per altri problemi rimangono NP-complete anche allora. Questi ultimi sono chiamati fortemente NP- completi . L'esempio più noto è l' imballaggio del contenitore .

È anche (e forse più) interessante vedere come cambia la complessità di un algoritmo se l'input è compresso . Nell'esempio dei numeri primi di Mersenne, abbiamo visto tre codifiche, ognuna delle quali è logaritmicamente più compressa rispetto al suo predecessore.

Nel 1983, Hana Galperin e Avi Wigderson hanno scritto un articolo interessante sulla complessità degli algoritmi grafici comuni quando la codifica di input del grafico è compressa logaritmicamente. Per questi input, il linguaggio dei grafici contenenti un triangolo dall'alto (dove era chiaramente in P ) diventa improvvisamente completo di NP .

E questo perché le classi linguistiche come P e NP sono definite per le lingue , non per i problemi .


Questa risposta probabilmente non è utile per il livello di comprensione del richiedente. Leggi le altre risposte e vedi con cosa sta lottando Nanako. Pensi che questa risposta lo aiuterà?
Andres F.

Questa risposta potrebbe non aiutare OP, ma certamente aiuta altri lettori (me compreso).
Gabriel,

risposta molto utile! dovrebbe considerare di fissare i simboli matematici non visualizzati correttamente.
user1559897

4

Proverò a darti una definizione meno informale per lo stesso.

Problemi P: problemi che possono essere risolti in tempi polinomiali. Contiene problemi che possono essere risolti in modo efficiente.

Problema NP: problemi che possono essere verificati in tempo polinomiale. Ad esempio: commesso viaggiatore, progettazione di circuiti. I problemi NP sono un po 'come i puzzle (come il sudoku). Data una soluzione corretta per il problema, possiamo verificare la nostra soluzione molto velocemente, ma se davvero proviamo a risolverlo, potrebbe richiedere solo un'eternità.

Ora, P vs NP in realtà chiede se un problema la cui soluzione può essere rapidamente verificata per essere corretta, allora c'è sempre un modo rapido per risolverlo. Quindi scrivere in termini matematici: NP è un sottoinsieme di P o no?

Ora torniamo a NP completo: questi sono i problemi davvero difficili dei problemi NP. Pertanto, se esiste un modo più rapido per risolvere NP complete, NP complete diventa P e NP collasso in P.

NP difficile: i problemi che non possono nemmeno essere controllati nel tempo polinomiale non sono difficili. Ad esempio, la scelta della mossa migliore negli scacchi è una di queste.

Se qualcosa rimane poco chiaro, prova a guardare questo video: https://www.youtube.com/watch?v=YX40hbAHx3s

Spero che questo fornisca un contorno sfocato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.