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.
¿Puedo hacerlo mejor que esto? A saber, ¿hay un algoritmo de tiempo pseudo polinomial que se ejecuta en el tiempo con ?
¡Gracias por adelantado!
ds.algorithms
co.combinatorics
partition-problem
Firebrandt
fuente
fuente
Respuestas:
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 SS FS (i,j)∈FS S j i FS O(nA) FS
Si y son dos subsecuencias que dividen , entoncesS 2 SS1 S2 S
donde es la suma minkowski, y la suma entre tuplas se define por coordenadas.A+B={a+b|a∈A,b∈B}
Reclamo: desde y lleva tiempo .FS FS1 FS2 O~(|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) n A
La oculta factor es .log lognlognA
fuente
Si a alguien le importan los factores , con un análisis cuidadoso podemos probar que la complejidad temporal del algoritmo de Chao es .log O(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 enS S1 S2
fuente