Dodałbym jedną małą rzecz do odpowiedzi DW:
Widziałem ludzi, którzy tak myślą, ponieważ jednoargumentowy plecak jest w P, dlatego możemy go użyć zamiast Knapsacka, które najlepsze obecne algorytmy mają czas wykładniczy.
Niech będzie wejście i i rozważyć algorytm programowania dynamicznego dla plecakowych oraz jednoargumentowego Knapsack. Czas działania obu z nich to . To ten sam czas działania. To znaczy, jeśli masz dane wejściowe, nie będzie miało znaczenia, czy użyjesz programowania dynamicznego dla jednoargumentowego plecaka, czy programowania dynamicznego dla plecaka. Obaj zajmą (mniej więcej tyle samo czasu) na rozwiązanie problemu. Teoretycznie wszędzie, gdzie używasz jednego, możesz także użyć drugiego. Musisz tylko przekonwertować liczby z jednych na binarne i odwrotnie.k O ( n k )W={w1,…,wn}kO(nk)
Jaki jest więc sens definiowania złożoności algorytmów względem wielkości danych wejściowych? Dlaczego nie zawsze podawać je pod względem parametrów jako ?O(nk)
Jeśli zależy ci na problemie w izolacji, możesz to zrobić. W rzeczywistości tak często robią ludzie w algorytmach. Złożoność algorytmów graficznych jest często wyrażana w kategoriach liczby wierzchołków i liczby krawędzi, a nie wielkości łańcucha, który je koduje.
Ale dzieje się tak tylko wtedy, gdy mamy do czynienia z odosobnionym problemem. Nie jest to przydatne, gdy mamy do czynienia z problemami z różnego rodzaju danymi wejściowymi. W przypadku wykresów możemy mówić o czasie wykonywania wrt do liczby wierzchołków i krawędzi. W przypadku plecaka możemy porozmawiać o liczbie przedmiotów i wielkości plecaka. Ale co, jeśli chcemy porozmawiać o obu? Na przykład, gdy chcemy zmniejszyć liczbę problemów lub omówić klasę problemów, która obejmuje dowolne problemy, a nie tylko te z grafem jako danymi wejściowymi. Potrzebujemy uniwersalnego parametru wejść. Ogólnie rzecz biorąc, dane wejściowe to tylko ciąg znaków, to my interpretujemy ich symbole jako liczby jednostkowe, liczby binarne, wykresy itp. Aby opracować ogólną teorię złożoności algorytmu i problemów, potrzebny jest ogólny parametr danych wejściowych. Rozmiar danych wejściowych jest oczywistym wyborem i okazuje się na tyle solidny, że możemy na nim zbudować rozsądną teorię. To nie jedyna możliwość. Dla sztucznego możemy zbudować teorię opartą na2 do wielkości wejścia. Będzie dobrze działać.
Teraz decydujemy się na użycie rozmiaru jako naszego uniwersalnego parametru wejściowego, który zmusza nas do myślenia o kodowaniu obiektów w kategoriach łańcuchów. Są różne sposoby ich kodowania i mogą mieć różne rozmiary. (Sprawiają też, że różne rzeczy stają się łatwe / trudne.) Z punktu widzenia ogólnej teorii algorytmów ważne jest, czy kodujemy liczbę wejściową w jednostkowej, czy binarnej. Jeśli używamy jedności, a wielkość wynosi największa liczba, jaką otrzymamy, to . Jeśli używamy binarnego, może być tak duże jak . Więc kiedy mówimy o czasie wykonywania rozwiązywania problemów z plecakiem, gdzie rozmiar100 100 K 2 100 - 1 k k 2 100 - 1k100100k2100−1kwynosi 100, otrzymujemy dwie bardzo różne sytuacje: w jednym przypadku dbamy tylko o dane wejściowe, w których wynosi co najwyżej 100. W drugim przypadku dbamy o dane wejściowe, które mogą być tak duże, jak .k2100−1
Powiedzmy, że chcę sprawdzić, czy mogę zredukować SAT do plecaka w czasie wielomianowym. Powiedzmy, że formuła wejściowa dla SAT ma rozmiar . Wtedy będę mógł zbudować tylko wejście dla Knapsack która ma rozmiar wielomianu w . Powiedzmy, że to rozmiar danych wejściowych dla plecaka, który buduję. Jeśli użyję jedności, mogę jedynie ustawić na najwyżej . Jeśli używam binarnego, mogę ustawić tak duże, że . Okazuje się, że muszę ustawić dość duży, aby móc zredukować SAT do Knapsacka. Tak więc unary Knapsack nie będzie działał na redukcję SAT do niego. Jednak binarny plecak działałby. Będziemy mogli stworzyć instancję Knapsack ze znacznie większymnnp(n)kp(n)k2p(n)−1kk
jeśli użyjemy binarnego.
Inny sposób myślenia na ten temat: Załóżmy, że masz czarne pudełko, które rozwiązuje jednoetapowy plecak, i drugie, które rozwiązuje plecakowy. Załóżmy, że masz czas na zapisanie bitowego wpisu dla czarnej skrzynki. Która z czarnych skrzynek ma większą moc? Oczywiście ten, który wykorzystuje kodowanie binarne. Możemy go użyć do rozwiązania problemów plecaka, które mają wykładniczo większy porównaniu z problemami, które może rozwiązać pojedyncza czarna skrzynka plecaka.nk