Ich würde der Antwort von DW noch eine Kleinigkeit hinzufügen:
Ich habe Leute gesehen, die denken, dass, weil der unäre Knapsack in P ist, wir ihn anstelle des Knapsacks verwenden können, dessen beste aktuelle Algorithmen exponentielle Zeit haben.
Sei die Eingabe und k und betrachte den dynamischen Programmieralgorithmus für Knapsack und unären Knapsack. Die Laufzeit für beide von ihnen sind O ( n k ) . Es ist die gleiche Laufzeit. Dh wenn Sie eine Eingabe haben, spielt es keine Rolle, ob Sie die dynamische Programmierung für unary Knapsack oder die dynamische Programmierung für Knapsack verwenden. Beide benötigen (ungefähr) dieselbe Zeit, um die Probleminstanz zu lösen. Theoretisch kann man überall, wo man eins benutzt, auch das andere benutzen. Sie müssen nur Zahlen von unär nach binär konvertieren und umgekehrt.W={w1,…,wn}kO(nk)
Worum geht es also bei der Definition der Komplexität von Algorithmen in Abhängigkeit von der Größe der Eingaben? Warum geben Sie sie nicht immer als ?O(nk)
Wenn Ihnen ein Problem im Alleingang wichtig ist, können Sie dies tun. Tatsächlich ist es das, was Menschen in Algorithmen oft tun. Die Komplexität von Grafikalgorithmen wird häufig durch die Anzahl der Eckpunkte und die Anzahl der Kanten ausgedrückt, nicht durch die Größe der Zeichenfolge, die sie codiert.
Dies ist jedoch nur dann der Fall, wenn es sich um ein isoliertes Problem handelt. Dies ist nicht sinnvoll, wenn wir Probleme mit verschiedenen Arten von Eingaben haben. Bei Diagrammen können wir über die Laufzeit in Bezug auf die Anzahl der Eckpunkte und Kanten sprechen. Bei Knapsack können wir über die Anzahl der Artikel und die Größe des Knapsacks sprechen. Aber was ist, wenn wir über beides sprechen wollen? Zum Beispiel, wenn wir die Anzahl der Probleme reduzieren oder eine Klasse von Problemen diskutieren möchten, die beliebige Probleme enthält, nicht nur solche mit einem Graphen als Eingabe. Wir brauchen einen universellen Parameter von Eingaben. Eine Eingabe ist im Allgemeinen nur eine Zeichenfolge. Wir interpretieren ihre Symbole als unäre Zahlen, Binärzahlen, Diagramme usw. Um eine allgemeine Theorie der Komplexität von Algorithmen und Problemen zu entwickeln, benötigen wir einen allgemeinen Parameter für Eingaben. Die Größe der Eingabe ist eine naheliegende Wahl und es stellt sich heraus, dass sie robust genug ist, um darauf eine vernünftige Theorie aufzubauen. Es ist nicht die einzige Möglichkeit. Für einen Künstlichen können wir eine Theorie aufbauen, die darauf basiert auf die Größe der Eingabe. Es wird gut funktionieren.2
Jetzt entscheiden wir uns, die Größe als universellen Parameter für Eingaben zu verwenden. Sie zwingt uns, über die Codierung von Objekten in Form von Zeichenfolgen nachzudenken. Es gibt verschiedene Möglichkeiten, sie zu codieren, und sie können unterschiedliche Größen haben. (Sie machen auch verschiedene Dinge leicht / schwer.) Im Sinne einer allgemeinen Theorie von Algorithmen wird es wichtig, ob wir die eingegebene Zahl in unär oder binär codieren. Wenn wir unary verwenden und die Größe von 100 ist, erhalten wir die größte Zahl von 100 . Wenn wir binäres k verwenden, kann es bis zu 2 100 - 1 groß sein . Wenn wir also über die Laufzeit der Lösung von Knapsack-Problemen sprechen, bei denen die Größe von kk100100k2100−1kist 100 ergeben sich zwei sehr unterschiedliche Situationen: In einem Fall kümmern wir uns nur um Eingaben, bei denen höchstens 100 ist. In dem anderen Fall kümmern wir uns um Eingaben, die bis zu 2 100 - 1 groß sein können .k2100−1
Angenommen, ich möchte sehen, ob ich SAT in Polynomialzeit auf Knapsack reduzieren kann. Angenommen, die Eingabeformel für SAT hat die Größe . Dann kann ich nur eine Eingabe für Knapsack erstellen, die ein Größenpolynom in n hat . Angenommen, p ( n ) ist die Größe der Eingabe für Knapsack, die ich erstelle. Wenn ich unary benutze, kann ich k nur so setzen , dass es höchstens p ( n ) ist . Wenn ich binär verwende, kann ich k auf 2 p ( n ) - 1 setzen . Es stellt sich heraus, dass ich k setzen mussnnp(n)kp(n)k2p(n)−1kziemlich groß, um SAT auf Knapsack reduzieren zu können. Daher funktioniert unary Knapsack nicht, um SAT darauf zu reduzieren. Binary Knapsack würde jedoch funktionieren. Wir werden in der Lage sein, eine Knapsack-Instanz mit viel größerem zu erstellen,
wenn wir Binärdateien verwenden.k
Eine andere Möglichkeit, darüber nachzudenken: Angenommen, Sie haben eine Black Box, die den unären Knapsack löst, und eine andere, die den Knapsack löst. Angenommen, Sie haben Zeit, einen Bit-Eingang für die Blackbox zu schreiben . Welche der Blackboxen ist leistungsstärker? Offensichtlich derjenige, der binäre Codierung verwendet. Wir können es verwenden , um Knapsack Probleme zu lösen , die exponentiell größer haben k , um Probleme zu vergleichen , dass die einstellige Knapsack Blackbox lösen kann.nk