NP-zupełność Problemy: rozwiązywalne w czasie wielomianowym - O(nk) rozwiązywalne, ale nie w czasie wielomianowym (np., w czasie wykładniczym - O(kn)) nierozwiązywalne NP-zupełne (status nieznany; rozwiązywalne, ale nie wiadomo, czy w czasie wielomianowym)
Problemy abstrakcyjne Problem abstrakcyjny Q - relacja dwuargumentowa na zbiorze I egzemplarzy problemy i zbiorze S rozwiązań problemu. Problem optymalizacyjny - pewną wielkość trzeba zminimalizować albo zmaksymalizować. Problem decyzyjny - funkcja odwzorowująca zbiór egzemplarzy problemu I w zbiór rozwiązań {0,1} - rozwiązanie stanowi odpowiedź tak/nie.
Podejście oparte na teorii języków formalnych Alfabet - skończony zbiór symboli; język L nad - dowolny zbiór słów złożonych z symboli alfabetu . Na przykład: = {0,1}, L = {10, 11, 101, 111, 1011, 1101, 10001, ...} Tu L - język binarnych reprezentacji liczb pierwszych. Język złożony z wszystkich słów nad alfabetem oznacza się przez *. Algorytm A akceptuje słowo x{0,1}*, jeśli oblicza A(x)=1. Algorytm A odrzuca słowo x, jeśli A(x)=0. Język akceptowany przez algorytm A to zbiór L = {x{0,1}*: A(x)=1}. Język jest rozstrzygalny przez algorytm A, jeśli każdy ciąg binarny jest albo akseptowany, albo odrzucany przez A. Język jest rozstrzygalny w czasie wielomianowym za pomocą algorytmu A, jeśli dla dowolnego słowa x{0,1}* długości n algorytm rozstrzyga przynależność x do L w czasie O(nk).
Złożoność i weryfikacja Klasa złożoności P: P = {L {0,1}*: istnieje algorytm A rozstrzygający o L w czasie wielomianowym} Algorytm weryfikacji: algorytm o dwóch parametrach - wejściowy ciąg x i świadectwo y. Język weryfikowany przez algorytm A to: L = {x{0,1}*: istnieje y{0,1}* takie, że A(x, y) = 1} Klasa złożoności NP: L należy do NP, jeśli istnieje algorytm A L = {x{0,1}*: istnieje takie świadectwo y, gdzie |y|=O(|x|c), że A(x,y) = 1}
Redukowalność Język L1 jest redukowalny w czasie wielomianowym do języka L2 ( L1 P L2), jeśli istnieje obliczalna w czasie wielomianowym funkcja f: {0,1}* {0,1}* taka, że dla każdego x{0,1}*: xL1 wtedy i tylko wtedy, gdy f(x)L2 f {0,1}* {0,1}* L2 L1
NP-zupełność Język L {0, 1}* jest NP-zupełny (NPC), jeśli 1. LNP oraz 2. L’ P L dla każdego L’NP Jeśli język L spełnia własność (2), ale niekoniecznie (1), to L jest NP-trudny. Najprawdopodobniej zależność między P, NP i NPC wygląda następujące NP NPC P
Czy P = NP? Twierdzenie Jeśli jakikolwiek problem NP-zupełny jest rozwiązywalny w czasie wielomianowym, to P = NP. Jeśli jakikolwiek problem w NP nie jest rozwiązywalny w czasie wielomianowym, to żaden problem NP-zupełny nie jest rozwiązywalny w czasie wielomianowym.
Przykłady problemów NP-zupełnych Spełnialność układów logicznych Spełnialność formuł logicznych Problem kliki w grafie Problem pokrycia wierzchołkowego Problem sumy podzbioru Problem cyklu Hamiltona Problem komiwojażera
Przykład algorytmu aproksymacyjnego Problem komiwojażera z nierównością trójkąta Approx-TSP-Tour(G, c) 1 wybierz wierzchołek rV[G] na „korzeń” 2 zbuduj minimalne drzewo rozpinające T dla G o korzeniu r 3 niech L będzie listą wierzchołków drzewa T w kolejności preorder 4 return cykl Hamiltona H odwiedzający wierzchołki w takiej kolejności jak w L