Schnellere Pseudo-Polynom-Zeitalgorithmen für PARTITION

8

Ich möchte N gegebene Zahlen (kann gleich sein oder nicht) in 2 Teilmengen aufteilen, so dass die 2 Teilmengen eine möglichst nahe Summe haben und auch die Kardinalität der Mengen gleich ist (wenn n gerade ist) oder sich nur um 1 unterscheidet ( wenn n ungerade ist).

Ich denke, wir können dies in der Pseudopolynomzeit tun , wobei die Summe der Zahlen in der Menge ist.A.O(n2A)A

Kann ich es besser machen? Gibt es nämlich einen Pseudo-Polynom-Zeitalgorithmus, der in der Zeit mit läuft ?c < 2O(ncA)c<2

Danke im Voraus!

Firebrandt
quelle
1
Beachten Sie, dass Knapsack als Sonderfall über ein FPTAS verfügt . Siehe zB ELLawler. Schnelle Approximationsalgorithmen für Rucksackprobleme .
Mathieu Chapelle
1
@Oleksandr, besser gemeint ist, dass es einen Pseudo-Polynom-Algorithmus gibt, der in O (nA) läuft. Entschuldigung, dass ich nicht in Latex posten kann.
Firebrandt
4
Ich befürchte, dass diese Frage an der Grenze zu elementar ist. Beispiel: "Ist das Partitionsproblem mit der zusätzlichen Einschränkung, dass die beiden Sätze die gleiche Kardinalität haben müssen, immer noch NP-vollständig?" kann eine typische Hausaufgabenfrage sein, und ich befürchte, dass das Aufschreiben der Antwort negative Auswirkungen auf einige Kurse in Bezug auf die Komplexität der Berechnungen haben kann.
Tsuyoshi Ito
6
Wie ist das zu elementar? Der offensichtliche Ansatz ergibt , und die Frage ist, ob es einen besseren Algorithmus gibt, der in der Zeit läuft, wobei . Ich vermute, dass dies eine offene Frage ist. O ( n c A ) c < 2O(n2A)O(ncA)c<2
Peter Shor
3
@Firebrandt: Ich habe mir erlaubt, Ihre ursprüngliche Frage zu bearbeiten, um meine Version Ihrer Klarstellung hinzuzufügen (Ändern von in mit , da ich denke, dass dies wahrscheinlich eine offene Frage ist). Sie können es wieder in ändern, wenn Sie möchten. Ich denke, die Frage, die durch Ihre Kommentare geklärt wird, ist eindeutig auf Forschungsebene. O ( n c A ) c < 2 O ( n A )O(nA)O(ncA)c<2O(nA)
Peter Shor

Antworten:

7

Man kann das Entscheidungsproblem in Zeit lösen .O~(nA)

Lassen Sie die Reihenfolge der Zahlen . Definieren Sie als eine Menge, so dass wenn eine Teilfolge von der Länge , die sich zu summiert . Wenn wir berechnet haben , benötigen wir nur zusätzliche Zeit, um gründlich zu durchlaufen und Ihr Problem zu lösen.F S ( i , j ) F S.SFS(i,j)FSj i F S O ( n A ) F S.SjiFSO(nA)FS

Wenn und zwei sind, die partitionieren , dannS 2 S.S1S2S

FS=FS1+FS2

wobei ist die Minkowski-Summe, und die Addition zwischen Tupeln wird koordinatenweise definiert.A+B={a+b|aA,bB}

Behauptung: Die Berechnung von aus und dauert .F S 1FSFS1FS2O~(|S|A)

Beweis: Wenden Sie die 2D-Faltung auf zwei Tabellen der Größe.A×|S|

Der Algorithmus unterteilt die Sequenz in zwei gleich große Sequenzen, wendet jeweils eine Rekursion an und nimmt die Minkowski-Summe des Ergebnisses. Sei die Laufzeit im ungünstigsten Fall, wenn die Eingabe in den Algorithmus Elemente enthält und eine Obergrenze der Summe ist. Wir haben was .TA(n)nA

TA(n)=2TA(n/2)+AO~(n)
TA(n)=O~(nA)

Der versteckte Faktor ist .loglognlognA

Chao Xu
quelle
3

Wenn sich jemand um die Faktoren kümmert , können wir durch sorgfältige Analyse nachweisen, dass die zeitliche Komplexität für Chaos Algorithmus .logO(nAlog(nA))

Beweis. In der geraden Schicht des Rekursionsbaums teilen wir die Menge in zwei gleich große Mengen und , was und auf der ungeraden Schicht des Rekursionsbaums teilen wir die Menge in zwei "gleich summierte" Mengen und . Um genau zu sein, können wir eine Menge mit der Summe in zwei Mengen und wobei jede von ihnen eine Summe von ergibt , wobei höchstens ein Element übrig bleibt. Wir können dieses Element mit trivialer dynamischer Programmierung inSS1S2

Te(n,A)=To(n/2,A)+To(n/2,AA)+O(nAlog(nA)),
SS1S2SAS1S2A/2O(A). Dies ergibt wobei. Daher haben wir wobei , und . Dies ergibt .
To(n,A)=Te(n1,A/2)+Te(nn1,A/2)+O(nAlog(nA)),
n1=|S1|4 i = 1 n in 4 i = 1 A iA
T(n,A)i=14T(ni,Ai)+O(nAlog(nA)),
i=14nini=14AiAi, nin/2, AiA/2T(n,A)=O(nAlog(nA))
hqztrue
quelle