Jag försöker förstå dessa klassificeringar och varför de finns. Är min förståelse rätt? Om inte, vad?

  1. P är polynomkomplexitet, eller O(nk) för något icke-negativt reellt tal k, till exempel O(1), O(n1/2), O(n2), O(n3), etc. Om ett problem tillhör P, finns det åtminstone en algoritm som kan lösa det från grunden på polynomtid. Till exempel kan jag alltid räkna ut om något heltal n är primärt genom att slinga över 2 <= k <= sqrt(n) och kontrollera i varje steg om k delar n.

  2. NP är icke-deterministisk polynomkomplexitet. Jag vet inte riktigt vad det betyder för det att vara icke-deterministisk. Jag tror att det betyder att det är lätt att verifiera på polynomtid, men det kan vara polynomtid att lösa från grunden om vi inte redan känner till svar. Eftersom det kan lösas på polynomtid är alla P-problem också NP-problem. Heltalsfaktorisering citeras som ett exempel på NP, men jag förstår inte varför det inte är P, personligen, eftersom försöksfaktorisering tar O(sqrt(n)) tid.

  3. NP-Complete Jag förstår inte alls, men Resande säljare Problemet citeras som ett exempel på detta. Men enligt min mening kan TSP-problemet bara vara NP, eftersom det krävs något som O(2n n2) time to solve, but O(n) för att verifiera om du får vägen framåt.

  4. NP-Hard antar jag att den bara är full av okända. Svårt att verifiera, svårt att lösa.

Kommentarer

  • Har du läst frågan om CS. SE Vad är definitionen av P, NP, NP-komplett och NP-hård? ?
  • Jag har inte ’ har inte sett den länken ännu, nej. Jag ’ Jag läser den igen, tack
  • Det CS.SE-svaret är ganska imponerande , men jag tror att det ’ är möjligt att ge en mycket kortfattad och icke-vilseledande förklaring av vad dessa termer betyder utan att gå in i så mycket detalj. @Nakano skulle vara intresserad av en kortare , ” till punkten svarar eller löser det CS.SE-inlägget ditt problem?
  • @ MichaelT Jag läste igenom den länken och tyckte att det var riktigt ordentligt och inte särskilt tydligt på flera punkter. Jag känner att det bara gav mig fler frågor än svar.
  • ” icke-deterministisk ” kan tolkas som ” med ett val väljer datorn rätt val varje gång ”.

Svar

Du är i grunden korrekt om P och NP, men inte om NP-hård och NP-komplett.

Till att börja med, här är de superknappa definitionerna av de fyra komplexitetsklasserna i fråga:

  • P är klassen av beslutsproblem som kan lösas i polynomtid med en deterministisk Turing-maskin.

  • NP är klassen av beslutsproblem som kan lösas i polynomtid med en icke-deterministisk Turing-maskin. Likväl är det klassen av problem som kan verifieras i polynomtid av en deterministisk Turing-maskin.

  • NP-hård är den klass av beslutsproblem som alla problem i NP kan vara reducerad till polynomisk tid av en deterministisk Turing-maskin.

  • NP-komplett är skärningspunkten mellan NP-hård och NP. På motsvarande sätt är NP-komplett den klass av beslutsproblem i NP som alla andra problem i NP kan reduceras till på polynomtid med en deterministisk Turing-maskin.

Och här ”sa Euler diagram från Wikipedia som visar förhållandena mellan dessa fyra klasser (förutsatt att P inte är lika med NP):

ange bildbeskrivning här

Den del som jag antar att du inte är bekant med eller förvirrad av är tanken på en ”polynomisk tidsreduktion” från problem X till problem Y. En reduktion från X till Y är helt enkelt en algoritm A som löser X genom att använda någon annan algoritm B som löser problem Y. Denna reduktion kallas en ” polynom tidsreduktion ”om alla delar av A utom B har en polynomisk tidskomplexitet. Som ett trivialt exempel är problemet med att hitta det minsta elementet i en matris konstant reducerat till sorteringsproblemet, eftersom du kan sortera matrisen och sedan returnera det första elementet i den sorterade matrisen.

En sak som är lätt att missa med NP-hårda definitionen är att minskningen går från NP-problem till NP-svårt problem, men inte nödvändigtvis vice versa . Detta innebär att NP-hårda problem kan vara i NP, eller i en mycket högre komplexitetsklass (som du kan se från Euler-diagrammet), eller de kan inte ens vara avgörbara problem.Därför säger folk ofta något som ”NP-hårt betyder minst lika hårt som NP” när man försöker förklara det här informellt.

Att stoppa problemet är ett bra exempel på ett NP-svårt problem som ”är tydligt inte i NP, som Wikipedia förklarar :

Det är lätt att bevisa att det stoppande problemet är NP-svårt men inte NP-komplett. Till exempel kan det booleska tillfredsställande problemet reduceras till det stoppande problemet genom att omvandla det till beskrivningen av en Turing-maskin som försöker alla sanningsvärdetilldelningar och när den hittar en som uppfyller formeln stannar den och annars går den i en oändlig slinga. Det är också lätt att se att stoppproblemet inte finns i NP eftersom alla problem i NP kan avgöras i ett begränsat antal operationer, medan stoppproblemet i allmänhet är obeslutbart.

Kommentarer

  • @Nakano Intuitivt är det ’ sa ” minskning ” i den meningen att ett problem görs till ett delproblem av något annat problem. Det faktum att vissa av dessa minskningar ökar komplexiteten istället för att minska den genom dåligt val av ” underproblem ” betyder helt enkelt att du aldrig skulle använda dessa minskningar i någon riktig världskod. Men för att vara ärlig NP-hård ser jag mig som en konstig och inte väldigt intressant klass; det kan vara mer fruktbart att ignorera det och bara tänka på NP-komplett som den uppsättning NP-problem som alla andra NP-problem minskar till.
  • @Nakano stackoverflow.com/questions/12637582/… Jag tror att det korta svaret är att när folk talar om att helfaktorisering är NP så ’ talar normalt om riktigt enorma heltal, för vilka du i allmänhet börjar göra dina stora O-bevis med n som ” antalet bitar som heltalet tar upp i minnet ” istället för ” antalet heltal du skickade till funktionen ”.
  • @Nakano: I stor-O-notering är n ett mått på storleken på ingången (antal element, byte, siffror etc.), inte värdet på input.
  • @Nakano Det korta svaret är att du ’ är okej, och det är därför du gör tid co mplexity analaysis du behöver alltid ange vad n betyder . Påståendet att n är ” storleken på ingången ” är bara en kort sammanfattning av hur vi normalt väljer att definiera n. Det ’ är inte en del av de stränga definitionerna av stor-O-notering eller tidskomplexitet. Jag tror att du har rätt att säga att heltalsfaktorisering är O (sqrt (n)) när n är ingångens värde . Det händer precis att komplexitetsresultaten där n betyder storlek vanligtvis är mycket mer användbara i praktiken än de där n betyder värde.
  • @Nakano Det ’ Det är också värt att komma ihåg att tekniskt du också måste definiera tidskomplexiteten för dina primitiva operationer (addition, multitplikation, läsning från minne, skrivning till minne, jämförelse av två siffror). För det mesta antar vi antingen att alla dessa primitiva är konstanta eller så räknar vi bara en typ av operation (t.ex. för sorteringsalgoritmer räknar vi traditionellt jämförelserna). Jag misstänker att resultaten för helfaktorisering inte ’ antar att alla dessa operationer är konstanta som vi brukar göra, annars skulle storleken på talet inte ’ t betyder mycket.

Svar

Heltalsfaktorisering citeras som ett exempel på NP, men jag förstår inte varför det inte är P, personligen, eftersom försöksfaktorisering tar O (sqrt (n)) tid.

För komplexitetsklasser är n ingångens längd. Så om du vill faktorera heltal k är n inte k men log k, antalet bitar (eller vad som helst) som krävs för att skriva ner numret. Så heltal faktorisering är O(sqrt(k)) som du säger, men det här är O(sqrt(2n)) vilket är O(2(n/2)).

NP-Hard antar jag att den bara är full av okända. Svårt att verifiera, svårt att lösa.

Nej. NP-Hard handlar bara om hur svårt ett problem är att lösa.

NP-Hard-problem är åtminstone hårda som det svåraste problemet i NP. Vi vet att de är åtminstone så hårda, för om vi hade en polynom-tidsalgoritm för ett NP-Hard-problem skulle vi kunna anpassa den algoritmen till alla problem i NP.

NP-Complete Jag förstår inte alls

NP- Komplett betyder att ett problem är både NP och NP-Hard. Det betyder att vi snabbt kan verifiera en lösning (NP), men det är minst lika svårt som det svåraste problemet i NP (NP-Hard).

Jag vet inte riktigt vad det betyder för det att vara icke-deterministisk.

Non -bestämning är en alternativ definition av NP. En icke-deterministisk turingmaskin kan effektivt duplicera sig själv när som helst och låta varje duplikat ta en annan körväg. Enligt denna definition är NP en uppsättning av de problem som kan lösas på polynom av en dator än att fritt kan duplicera sig själv. Det visar sig att detta är exakt samma uppsättning problem som kan verifieras på polynom.

Kommentarer

  • Så det är möjligt för $ O ( n ^ k) $ tidsalgoritmer för att vara NP-problem?
  • k är ett konstant reellt tal? Ja. Alla P-problem är också NP-problem. Uppenbarligen kan allt du kan lösa på polynomtid också verifieras på polynomtid.
  • Hur definieras längd / storlek egentligen här? Till exempel kan jag bara skriva $ n $ i en stor bas och minska dess längd när den skrivs. Vad sägs om problem som inte ’ t uttryckligen behandlar heltal, men säg grafer med $ V $ -hörnpunkter och $ E $ -kanter osv.
  • @Nakano, faktiskt en stor bas skulle ’ inte ändra den, eftersom den bara skulle vara en konstant faktorskillnad. Så det skulle ’ inte påverka polynom jämfört med icke-polynom. Men om du skrev numret i unary, skulle det ändra det.
  • @Nakano, hmm … Jag skulle inte ’ t vågar försöka förklara komplexiteten lektioner till en femåring. : P

Svar

Det första du måste förstå är att P och NP klassificera språk , inte problem . För att förstå vad detta betyder behöver vi först några andra definitioner.

Ett alfabet är en icke tom slutlig uppsättning symboler.

{0 , 1} är ett alfabet liksom ASCII-teckenuppsättningen. {} är inte ett alfabet eftersom det är tomt. N (heltal) är inte ett alfabet eftersom det inte är ändligt.

Låt Σ vara ett alfabet. En ordnad sammanfogning av ett begränsat antal symboler från Σ kallas ett ord över Σ .

Strängen 101 är ett ord över alfabetet {0, 1}. Det tomma ordet (ofta skrivet som ε ) är ett ord över vilket alfabet som helst. Strängen penguin är ett ord över alfabetet som innehåller ASCII-tecknen. Decimalteckningen av numret π är inte ett ord över alfabetet {., 0, 1, 2, 3, 4, 5, 6, 7, 8, 9} eftersom det inte är ändligt.

längd av ett ord w , skrivet som | w |, är antalet symboler i den.

Till exempel | hello | = 5 och | ε | = 0. För alla ord w , | w | ∈ N och därför ändlig.

Låt Σ vara ett alfabet. Uppsättningen Σ innehåller alla ord över Σ , inklusive ε . Uppsättningen Σ + innehåller alla ord över Σ , med undantag av ε . För n N , Σ n är uppsättningen ord med längden n .

För varje alfabet Σ , Σ och Σ + är oändliga räknbara uppsättningar .För ASCII-teckenuppsättningen Σ ASCII är de reguljära uttrycken .* och .+ betecknar Σ ASCII och Σ ASCII + .

{0, 1} 7 är en uppsättning av 7-bitars ASCII-koder {0000000, 0000001,…, 1111111}. {0, 1} 32 är uppsättningen med 32-bitars heltalsvärden.

Låt Σ vara ett alfabet och L &subseteq; Σ . L kallas ett språk över Σ .

För ett alfabet Σ , tom uppsättning och Σ är triviala språk över Σ . Det förra kallas ofta det tomma språket . Det tomma språket {} och det språk som endast innehåller det tomma ordet { ε } skiljer sig åt.

Delmängden av {0, 1} 32 som motsvarar icke-NaN IEEE 754 flytpunktsvärden är ett ändligt språk.

Språk kan ha ett oändligt antal ord men varje språk kan räknas. Uppsättningen strängar {1, 2,…} som anger heltal i decimalnotation är ett oändligt språk över alfabetet = ”e934c0f1bf”>

,1,2,3,4,5,6,7,8,9}. Den oändliga stränguppsättningen {2,3,5,7,11,13, …} som anger primtal i decimalnotation är en korrekt delmängd därav. Språket som innehåller alla ord som matchar det reguljära uttrycket[+-]?\d+\.\d*([eE][+-]?\d+)?är ett språk över ASCII-teckenuppsättningen (betecknar en delmängd av de giltiga flytpunktsuttrycken som definierats av C-programmeringsspråket).

Det finns inget språk som innehåller alla reella tal (i någon notation) eftersom uppsättningen av reella tal inte kan räknas.

Låt Σ vara ett alfabet och L &subseteq; Σ . En maskin D bestämmer L om för varje ingång w &in; Σ den beräknar karakteristisk funktion χ L ( w ) på begränsad tid. Den karakteristiska funktionen definieras som

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

En sådan maskin kallas en avgörare för L . Vi skriver “ D ( w ) = x ” för ”given w , D matar ut x ”.

Det finns många maskinmodeller. Den mest allmänna som används idag är modellen för en Turingmaskin . En Turing-maskin har obegränsad linjär lagring grupperad i celler. Varje cell kan innehålla exakt en symbol i ett alfabet när som helst. Turing-maskinen utför sin beräkning som en sekvens av beräkningssteg. I varje steg kan den läsa en cell, eventuellt skriva över dess värde och flytta läs / skrivhuvudet med en position till vänster eller höger cell. Vilken åtgärd maskinen kommer att utföra styrs av en slutlig automat.

En maskin med slumpmässig åtkomst med en begränsad uppsättning instruktioner och obegränsad lagring är en annan maskinmodell som är lika kraftfull som Turing-maskinmodellen. p>

För denna diskussions skull ska vi inte bry oss om den exakta maskinmodell vi använder utan räcker med att säga att maskinen har en ändlig deterministisk styrenhet, obegränsad lagring och utför en beräkning som en sekvens av steg det kan räknas.

Eftersom du har använt det i din fråga antar jag att du redan känner till “big-O” notation så här är bara en snabb uppdatering.

Låt f : N → vara en funktion.Uppsättningen O ( f ) innehåller alla funktioner g : N N för vilka det finns konstanter n 0 N och c N så att för varje n N med n > n 0 det är sant att g ( n ) ≤ c f ( n ).

Nu är vi beredda att närma oss den verkliga frågan.

Klassen P innehåller alla språk L för vilka det finns en Turing-maskin D som bestämmer L och en konstant k N så att för varje ingång w , D stoppas efter högst T (| w |) steg för en funktion T O ( n n k ).

Eftersom O ( n n k ), även om det är matematiskt korrekt, är det obekvämt att skriva och läsa, de flesta – för att vara ärliga, alla utom jag själv – skriver vanligtvis helt enkelt O(nk ).

Observera att gränsen beror på längden på w . Därför är argumentet du gör för primerspråket bara korrekt för siffror i unaray-kodningar , där för kodningen w av ett tal n , längden på kodningen | w | är proportionell mot n . Ingen skulle någonsin använda en sådan kodning i praktiken. Med hjälp av en mer avancerad algoritm än att bara testa alla möjliga faktorer kan det dock visas att språket för primtal kvarstår i P om ingångarna är kodade i binär (eller till någon annan bas). (Trots stort intresse kunde detta bara bevisas av Manindra Agrawal, Neeraj Kayal och Nitin Saxena i ett prisbelönt papper 2004 så att du kan gissa att algoritmen är inte så enkel.)

De triviala språken {} och Σ och det icke-triviala språket { ε } finns uppenbarligen i P (för alla alfabet Σ ). Kan du skriva funktioner i ditt favoritprogrammeringsspråk som tar en sträng som inmatning och returnerar en boolean som berättar om strängen är ett ord från språket för vart och ett av dessa och bevisar att din funktion har polynomisk körtids komplexitet? p> Alla vanliga språk (ett språk som beskrivs av ett reguljärt uttryck) finns i P .

Låt Σ vara ett alfabet och L &subseteq; Σ . En maskin V som tar en kodad tuple med två ord w , c Σ och matar ut 0 eller 1 efter ett slutligt antal steg är en verifier för L om den har följande egenskaper.

  • Givet ( w , c ), V matar endast 1 om w L .
  • För varje w L finns det finns en c Σ så att V ( w , c ) = 1.

c i ovanstående definition kallas ett vittne (eller certifikat ) .

En verifierare får ge falska negativ för fel vittne även om w faktiskt finns i L . Det är dock inte tillåtet att ge falska positiva resultat. Det krävs också att det finns minst ett vittne för varje ord i språket.

För språket COMPOSITE, som innehåller decimalkodningarna för alla heltal som är inte primära , ett vittne kan vara en faktorisering. Till exempel är (659, 709) ett vittne för 467231 ∈ COMPOSITE. Du kan enkelt verifiera att det på ett papper utan vittnesbördet är bevisat att 467231 inte är bra utan att använda en dator.

Vi sa inget om hur ett lämpligt vittne kan vara hittades. Detta är den icke-deterministiska delen.

Klassen NP innehåller alla språk L för vilka det finns en Turing-maskin V som verifierar L och en konstant k N så att för varje ingång ( w , c ), V stoppar efter högst T (| w |) steg för en funktion T O ( n nk ).

Observera att ovanstående definition innebär att för varje w L finns ett vittne c med | c | ≤ T (| w |). (Turing-maskinen kan omöjligt titta på fler vittnesymboler.)

NP är en överuppsättning av P (varför?). Det är inte känt om det finns språk som finns i NP men inte i P .

Heltalsfaktorisering är inte ett språk i sig. Vi kan dock konstruera ett språk som representerar beslutsproblemet som är associerat med det. Det vill säga ett språk som innehåller alla tuplar ( n , m ) så att n har en faktor d med d &leq; m . Låt oss kalla detta språk FACTOR. Om du har en algoritm för att bestämma FACTOR kan den användas för att beräkna en fullständig faktorisering med endast polynomomkostnader genom att utföra en rekursiv binär sökning för varje primfaktor.

Det är lätt att visa att FACTOR är i NP . Ett lämpligt vittne skulle helt enkelt vara faktorn d själv och allt verifieraren skulle behöva göra är att verifiera att d &leq; m och n mod d = 0. Allt detta kan göras på polynomtid. (Kom ihåg igen att det är längden på kodningen som räknas och att det är logaritmisk i n .)

Om du kan visa att FACTOR också finns i P kan du vara säker på att få många coola priser. (Och du har brutit en betydande del av dagens kryptografi.)

För varje språk i NP finns en brute-force algoritm som bestämmer det deterministiskt. Det utför helt enkelt en uttömmande sökning över alla vittnen. (Observera att ett vittnes maximala längd begränsas av ett polynom.) Så din algoritm för att bestämma PRIMES var faktiskt en brute-force-algoritm för att bestämma COMPOSITE.

För att ta itu med din sista fråga måste vi introducera reduktion . Reduktioner är ett mycket kraftfullt begrepp för teoretisk datavetenskap. Att reducera ett problem till ett annat innebär i grunden att lösa ett problem genom att lösa ett annat problem.

Låt Σ vara ett alfabet och A och B vara språk över Σ . A är polynomtid många-en reducerbar till B om det finns en funktion f : Σ Σ med följande egenskaper.

  • w A   ⇔   f ( w ) ∈ B   för alla w Σ .
  • Funktionen f kan beräknas av en Turing-maskin för varje ingång w i ett antal steg avgränsat av ett polynom i | w |.

I det här fallet skriver vi A p B .

För låt A vara språket som innehåller alla grafer (kodade som angränsningsmatris) som innehåller en triangel. (En triangel är en cykel med längd 3.) Låt vidare B vara språket som innehåller alla matriser med spår som inte är noll. (Spårningen av en matris är summan av dess huvudsakliga diagonala element.) Då är A polynomtid många-en reducerbar till B . För att bevisa detta måste vi hitta en lämplig transformationsfunktion f . I det här fallet kan vi ställa in f för att beräkna 3 rd -effekten för angränsningsmatrisen. Detta kräver två matrismatrisprodukter, som alla har polynomkomplexitet.

Det är triviellt sant att L p L . (Kan du bevisa det formellt?)

Vi kommer att tillämpa detta på NP nu.

Ett språk L är NP -hard om och endast om L ”≤ p L för varje språk L ” ∈ NP .

Ett NP -hårt språk kan eller inte kan vara i NP själv.

Ett språk L är NP -komplett om och bara om

  • L NP och
  • L är NP -hårt.

Det mest kända NP -kompletta språket är SAT. Den innehåller alla booleska formler som kan uppfyllas. Till exempel ( a b ) ∧ (¬ a ∨ ¬ b ) ∈ SAT. Ett giltigt vittne är { a = 1, b = 0}. Formeln ( a b ) ∧ (¬ a b ) ∧ ¬ b ∉ SAT. (Hur skulle du bevisa det?)

Det är inte svårt att visa att SAT ∈ NP . Att visa NP -hårdheten hos SAT är lite arbete men det gjordes 1971 av Stephen Cook .

När det enda NP -kompletta språket var känt, var det relativt enkelt att visa NP -kompletten hos andra språk via reduktion. Om språket A är känt för att vara NP -hårt, visar sedan att A p B visar att B också är NP -hårt (via transitiviteten för ”≤ p ”). 1972 publicerade Richard Karp en lista över 21 språk som han kunde visa var NP -komplett via (transitiv) minskning av SAT. (Det här är det enda papperet i det här svaret som jag faktiskt rekommenderar att du ska läsa. Till skillnad från de andra är det inte svårt att förstå och ger en väldigt bra uppfattning om hur bevisning av NP -komplett via reduktion fungerar. )

Slutligen en kort sammanfattning. Vi använder symbolerna NPH och NPC för att beteckna klasserna av NP -hårda och NP -kompletta språk respektive.

  • P &subseteq; NP
  • NPC &subset; NP och NPC &subset; NPH , faktiskt NPC = NP NPH per definition
  • ( A NP ) ∧ ( B NPH )   ⇒   A p B

Observera att inkluderingen NPC &subset; NP är korrekt även om P = NP . För att se detta, gör dig själv klar att inget icke-trivialt språk kan reduceras till ett trivialt språk och det finns triviala språk i P också som icke-triviala språk i NP . Thi s är dock ett (inte särskilt intressant) hörnfall.

Tillägg

Din primära källa till förvirring verkar vara att du tänkte på ” n ”i“ O ( n f ( n )) ”Som tolkning av en algoritms ingång när den faktiskt hänvisar till längden på ingången. Detta är en viktig skillnad eftersom det betyder att den asymptotiska komplexiteten hos en algoritm beror på den kodning som används för inmatningen.

Denna vecka, en ny post för den största kända Mersenne prime uppnåddes. Det största för närvarande kända primtalet är 2 74   207   281 – 1. Detta tal är så stort att det ger mig huvudvärk så jag använder en mindre i följande exempel: 2 31 – 1 = 2   147   483   647. Det kan kodas på olika sätt.

  • av dess Mersenne-exponent som decimaltal: 31 (2 byte)
  • som decimaltal: 2147483647 (10 byte)
  • som unary nummer: 11111…11 där ska ersättas med 2   147   483   640 fler 1 s (nästan 2 GiB)

Alla dessa strängar kodar samma nummer och med tanke på någon av dessa kan vi enkelt konstruera någon annan kodning av samma nummer. (Du kan ersätta decimalkodning med binär, oktal eller hexadeci mal om du vill. Det ändrar bara längden med en konstant faktor.)

Den naiva algoritmen för att testa primality är endast polynom för unary kodning. AKS primality test är polynom för decimal (eller någon annan bas b ≥ 2 ). Lucas-Lehmer primality test är den mest kända algoritmen för Mersennes primtal M p med p en udda prime men den är fortfarande exponentiell i längden på den binära kodningen av Mersenne-exponenten p (polynom i p ).

Om vi vill prata om komplexiteten i en algoritm är det mycket viktigt att vi är mycket tydliga vilken representation vi använder. I allmänhet kan man anta att den mest effektiva kodningen används. Det vill säga binärt för heltal. (Observera att inte varje primtal är en Mersenne-prime så att använda Mersenne-exponenten inte är ett allmänt kodningsschema.)

I teoretisk kryptografi skickas många algoritmer formellt en helt värdelös sträng av k 1 är som första parameter. Algoritmen tittar aldrig på den här parametern, men den låter den formellt vara polynom i k , vilket är säkerhetsparameter används för att ställa in procedurens säkerhet.

För vissa problem för vilka beslutsspråket i binär kodning är NP -komplett är beslutsspråket inte längre NP -komplett om kodningen av inbäddade nummer växlas till unary. Beslutsspråken för andra problem förblir NP -kompletta även då. De senare kallas starkt NP -komplett . Det mest kända exemplet är binpackning .

Det är också (och kanske mer) intressant att se hur komplexiteten hos en algoritm ändras om ingången är komprimerad . Till exempel med Mersennes primtal har vi sett tre kodningar, som var och en är logaritmiskt mer komprimerad än sin föregångare.

1983, Hana Galperin och Avi Wigderson har skrivit ett intressant dokument om komplexiteten hos vanliga grafalgoritmer när ingångskodningen för grafen komprimeras logaritmiskt. För dessa ingångar blir språket för grafer som innehåller en triangel uppifrån (där det var tydligt i P ) plötsligt NP -komplett.

Och det ”eftersom språkklasser som P och NP definieras för språk , inte för problem .

Kommentarer

  • Det här svaret är förmodligen inte användbart för förståelsens nivå. Läs de andra svaren och se vad Nanako kämpar med. Tror du det här svaret hjälper honom / henne?
  • Det här svaret kanske inte hjälper OP, men hjälper verkligen andra läsare (jag själv inkluderad).
  • mycket hjälpsamt svar! bör överväga att fixa matematiska symboler inte korrekt visas.

Svar

Jag ska försöka ge dig mindre informell definition för samma.

P-problem: problem som kan lösas på polynomtid. Innehåller problem som effektivt kan lösas.

NP-problem: problem som kan verifieras i polyno mial tid. Till exempel: Resande säljare, kretsdesign. NP-problem är ungefär som pussel (som sudoku). Med en korrekt lösning på problemet kan vi kontrollera vår lösning väldigt snabbt, men om vi faktiskt försöker lösa det kan det ta en evighet.

Nu frågar P vs NP faktiskt om ett problem vars lösning kan vara snabbt kontrolleras för att vara korrekt, då finns det alltid ett snabbt sätt att lösa det. Således skriver man i matematiska termer: är NP en delmängd av P eller inte?

Nu kommer vi tillbaka till NP komplett: dessa är de riktigt svåra problemen med NP-problemen. Därför, om det finns ett snabbare sätt att lösa NP komplett så blir NP komplett P och NP problem kollapsar i P.

NP hårt: problem som inte ens kan kontrolleras under polynomtiden är np hårda. Att välja det bästa draget i schack är till exempel en av dem.

Om något förblir oklart kan du prova att titta på den här videon: https://www.youtube.com/watch?v=YX40hbAHx3s

Jag hoppas att detta kommer att ge lite suddig kontur.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *