Teilmenge-Summe-Problem

In der Informatik ist das Teilmenge-Summe-Problem ein wichtiges Problem in der Kompliziertheitstheorie und Geheimschrift. Das Problem ist das: In Anbetracht einer Reihe von ganzen Zahlen, ist dort eine nichtleere Teilmenge wessen Summe ist Null? Zum Beispiel, in Anbetracht des Satzes {−7, −3, −2, 5, 8}, ist die Antwort ja, weil die Teilmenge {−3, −2, 5} zur Null resümiert. Das Problem ist NP-complete.

Ein gleichwertiges Problem ist das: In Anbetracht einer Reihe von ganzen Zahlen und einer ganzen Zahl s, tut eine nichtleere Teilmenge-Summe zu s? Von Teilmenge-Summe kann auch als ein spezieller Fall des Rucksack-Problems gedacht werden. Ein interessanter spezieller Fall der Teilmenge-Summe ist das Teilungsproblem, in dem s Hälfte der Summe aller Elemente im Satz ist.

Kompliziertheit

Die Kompliziertheit (Schwierigkeit der Lösung) der Teilmenge-Summe kann als abhängig von zwei Rahmen, N, der Zahl von Entscheidungsvariablen und P angesehen werden, die Präzision des Problems (hat als die Zahl von binären Platz-Werten festgesetzt, dass es bringt, um das Problem festzusetzen). (Bemerken Sie: Hier bedeuten die Briefe N und P etwas anderes als, was sie in der NP Klasse von Problemen vorhaben.)

Die Kompliziertheit der am besten bekannten Algorithmen ist in den kleineren von den zwei Rahmen N und P Exponential-. So ist das Problem am schwierigsten, wenn N und P derselben Ordnung sind. Es wird nur leicht, wenn entweder N oder P sehr klein werden.

Wenn N (die Zahl von Variablen) klein ist, dann ist eine erschöpfende Suche nach der Lösung praktisch. Wenn P (die Zahl von Platz-Werten) eine kleine festgelegte Zahl ist, dann gibt es dynamische Programmieralgorithmen, die es genau lösen können.

Effiziente Algorithmen sowohl für kleinen N als auch für kleine P Fälle werden unten gegeben.

Exponentialzeitalgorithmus

Es gibt mehrere Weisen, in N rechtzeitig Exponential-Teilmenge-Summe zu lösen. Der am meisten naive Algorithmus würde durch alle Teilmengen von N Zahlen und, für jeden von ihnen Rad fahren sollen, zu überprüfen, ob die Teilmenge zur richtigen Zahl resümiert. Die Laufzeit ist des Auftrags O (2N), da es 2 Teilmengen gibt und, um jede Teilmenge zu überprüfen, müssen wir an den meisten N Elementen resümieren.

Ein besserer Exponentialzeitalgorithmus ist bekannt, der rechtzeitig O (2) läuft. Der Algorithmus spaltet willkürlich die N Elemente in zwei Sätze von N/2 jeder. Für jeden dieser zwei Sätze versorgt es eine Liste der Summen aller 2 möglichen Teilmengen seiner Elemente. Jede dieser zwei Listen wird dann sortiert. Das Verwenden eines Standardvergleich-Sortieren-Algorithmus für diesen Schritt würde O (2N) Zeit in Anspruch nehmen. Jedoch, in Anbetracht einer sortierten Liste von Summen für k Elemente, kann die Liste zu zwei sortierten Listen mit der Einführung (k + 1) St.-Element ausgebreitet werden, und diese zwei sortierten Listen können rechtzeitig O (2) verschmolzen werden. So kann jede Liste in der sortierten Form rechtzeitig O (2) erzeugt werden. In Anbetracht der zwei sortierten Listen kann der Algorithmus überprüfen, ob ein Element der ersten Reihe und ein Element der zweiten Reihe zu s rechtzeitig O (2) summieren. Um das zu tun, führt der Algorithmus die erste Reihe in der abnehmenden Ordnung durch (am größten Element anfangend), und die zweite Reihe in der zunehmenden Ordnung (am kleinsten Element anfangend). Wann auch immer die Summe des aktuellen Elements in der ersten Reihe und des aktuellen Elements in der zweiten Reihe mehr ist als s, bewegt sich der Algorithmus zum folgenden Element in der ersten Reihe. Wenn es weniger ist als s, bewegt sich der Algorithmus zum folgenden Element in der zweiten Reihe. Wenn zwei Elemente mit der Summe s gefunden werden, hält sie an. Horowitz und Sahni haben zuerst diesen Algorithmus in einem technischen Bericht 1972 veröffentlicht.

Pseudopolynomische Zeit dynamische Programmierlösung

Das Problem kann wie folgt mit der dynamischen Programmierung behoben werden. Nehmen Sie an, dass die Folge ist

:x..., x

und wir möchten bestimmen, ob es eine nichtleere Teilmenge gibt, die zu s resümiert. Lassen Sie N die Summe der negativen Werte und P die Summe der positiven Werte sein. Definieren Sie die geboolean-schätzte Funktion Q (ich, s), um der Wert (wahr oder falsch) zu sein

: "es gibt eine nichtleere Teilmenge von x..., x, der zu s resümiert".

So ist die Lösung des Problems der Wert von Q (n, 0).

Klar, wenn


Herz / Pericles
Impressum & Datenschutz