Wenn klein genug ist, können Sie es besser machen als der naive Algorithmus, dh besser als 2 n Mal. Hier bedeutet "klein genug", dass m kleiner ist als etwas wie n / lg n . Die Laufzeit ist immer noch exponentiell - z. B. 2 n / 2 -, aber schneller als der naive Algorithmus.m2nmn/lgn2n/2
Übrigens sieht es so aus, als könnten wir das Problem in einigen Fällen, in denen die Matrix A eine superlineare Anzahl von Einträgen aufweist, schneller als lösen . Ich weiß nicht, wie ich das mit der anderen Antwort hier in Einklang bringen soll. Daher sollten Sie meine Antwort sorgfältig prüfen: Dies könnte darauf hinweisen, dass ich irgendwo einen schwerwiegenden Fehler gemacht habe.2nA
Der grundlegende Ansatz: schreibe , wobei x 0 die ersten n / 2 Komponenten von x und x 1 die letzten n / 2 Komponenten enthält; und ähnlich A = ( A 0 , A 1 ) , wobei A 0 die linken n / 2 Spalten von A und A 1 die rechten n hatx=(x0,x1)x0n/2xx1n/2A=(A0,A1)A0n/2AA1 Spalten. Jetzt kann A x ≤ b in der Form neu geschrieben werdenn/2Ax≤b
A0x0+A1x1≤b,
oder gleichwertig,
A0x0≤b−A1x1.
Zählen Sie alle Möglichkeiten für A 0 x 0 auf und lassen Sie S die Menge möglicher Werte bezeichnen, dh2n/2A0x0S
S={A0x0:x0∈{0,1}n/2}.
T2n/2b−A1x1
T={b−A1x1:x1∈{0,1}n/2}.
Jetzt wird das Problem
S,T⊆Zm2n/2s∈St∈Ts≤t
≤si≤tii
O(2n/2(n/2)m−1)mn/lgn2n
m=1m=1xi=1A1,i≤0xi=0x