Algoritmos de tiempo pseudo-polinomiales más rápidos para PARTICIÓN

8

Quiero dividir N números dados (pueden o no ser iguales) en 2 subconjuntos de modo que los 2 subconjuntos tengan una suma lo más cercana posible y también la cardinalidad de los conjuntos es igual (si n es par) o difiere solo en 1 ( si n es impar)

Creo que podemos hacer esto en tiempo pseudo polinomial , donde es la suma de números en el conjunto.O(n2A)A

¿Puedo hacerlo mejor que esto? A saber, ¿hay un algoritmo de tiempo pseudo polinomial que se ejecuta en el tiempo con ?O(ncA)c<2

¡Gracias por adelantado!

Firebrandt
fuente
1
Tenga en cuenta que, como un caso especial de mochila, tiene un FPTAS . Ver, por ejemplo, ELLawler. Algoritmos de aproximación rápida para problemas de mochila .
Mathieu Chapelle
1
@Oleksandr, por mejor me refería a si hay un algoritmo pseudo polinomial que se ejecuta en O (nA). lo siento, no puedo publicar en látex.
Firebrandt
44
Me temo que esta pregunta está al borde de ser demasiado elemental. Por ejemplo, "¿El problema de Partición con la restricción adicional de que los dos conjuntos deben tener la misma cardinalidad aún es NP-completo?" puede ser una pregunta típica de tarea y me temo que escribir la respuesta puede tener un impacto negativo en algunos cursos de complejidad computacional.
Tsuyoshi Ito
66
¿Cómo es esto demasiado elemental? El enfoque obvio da , y la pregunta es si hay un mejor algoritmo en ejecución en el tiempo donde . Mi conjetura es que esta es una pregunta abierta. O ( n c A ) c < 2O(n2A)O(ncA)c<2
Peter Shor
3
@Firebrandt: Me tomé la libertad de editar su pregunta original para agregar mi versión de su aclaración (cambiando a con , ya que creo que incluso esa es probablemente una pregunta abierta). Si lo desea , vuelva a cambiarlo a . Creo que la pregunta, como lo aclararon sus comentarios, es claramente de nivel de investigación. O ( n c A ) c < 2 O ( n A )O(nA)O(ncA)c<2O(nA)
Peter Shor

Respuestas:

7

Uno puede resolver el problema de decisión en .O~(nA)

Deje que la secuencia de números sea . Defina como un conjunto tal que si existe una subsecuencia de de longitud que sume a . Si hemos calculado , entonces solo necesitamos tiempo adicional para completar para resolver su problema.F S ( i , j ) F S S j i F S O ( n A ) F SSFS(i,j)FSSjiFSO(nA)FS

Si y son dos subsecuencias que dividen , entoncesS 2 SS1S2S

FS=FS1+FS2

donde es la suma minkowski, y la suma entre tuplas se define por coordenadas.A+B={a+b|aA,bB}

Reclamo: desde y lleva tiempo .FSFS1FS2O~(|S|A)

Prueba: aplique convolución 2D en dos tablas de tamaño.A×|S|

El algoritmo divide la secuencia en dos secuencias de igual tamaño, aplica recursividad a cada una y toma la suma minkowski del resultado. Sea el peor tiempo de ejecución cuando la entrada al algoritmo tiene elementos y es un límite superior de la suma. Tenemos que muestra .TA(n)nA

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

La oculta factor es .loglognlognA

Chao Xu
fuente
3

Si a alguien le importan los factores , con un análisis cuidadoso podemos probar que la complejidad temporal del algoritmo de Chao es .logO(nAlog(nA))

Prueba. En la capa uniforme del árbol de recursión, dividimos el conjunto en dos conjuntos de igual tamaño y , lo que da y en la capa impar del árbol de recursión, dividimos el conjunto en dos conjuntos "igualmente sumados" y . Para ser precisos, podemos dividir un conjunto con la suma en dos conjuntos y con cada uno de ellos sumando , con como máximo un elemento restante. Podemos lidiar con ese elemento con programación dinámica trivial enSS1S2

Te(n,A)=To(n/2,A)+To(n/2,AA)+O(nAlog(nA)),
SS1S2SAS1S2A/2O(A). Esto proporciona donde. Por lo tanto, tenemos donde , , y . Esto nos dará .
To(n,A)=Te(n1,A/2)+Te(nn1,A/2)+O(nAlog(nA)),
n1=|S1|
T(n,A)i=14T(ni,Ai)+O(nAlog(nA)),
i=14nini=14AiAi, nin/2, AiA/2T(n,A)=O(nAlog(nA))
hqztrue
fuente