Algoritmo eficiente para 'sumar' un conjunto de sumas


24

Dado un conjunto múltiple de números naturales X, considere el conjunto de todas las sumas posibles:

sums(X)={iAi|AX}

Por ejemplo, sums({1,5})={0,1,5,6} mientras que sums({1,1})={0,1,2} .

¿Cuál es el algoritmo más eficiente para calcular la operación inversa (medido en términos del tamaño del conjunto de sumas de entrada)? Específicamente, es posible calcular eficientemente cualquiera de los siguientes:

  1. Si un conjunto dado es un conjunto válido de sumas. (Por ejemplo, {0,1,2} es válido pero {0,1,3} no lo es).
  2. Un conjunto múltiple que suma al conjunto dado.
  3. El multiset más pequeño que se suma al conjunto dado. (Por ejemplo, {1,2} y {1,1,1} ambos suman {0,1,2,3} pero el primero es más pequeño).

1
¿Podría darnos el conjunto múltiple de sumas en lugar del conjunto de sumas? Esto crearía una simetría agradable (ya que comienza con un conjunto múltiple de valores).
DW

1
Otra pregunta: ¿está más interesado en resultados teóricos (p. Ej., Complejidad asintótica) o soluciones prácticas (esquemas que podrían funcionar bien en la práctica)? Si es esto último, ¿tiene una idea de los valores típicos de los parámetros: por ejemplo, el tamaño del multiset X, el tamaño del elemento más grande en el multiset X, la mayor multiplicidad? Esto podría afectar si es razonable aplicar un "gran martillo" como un solucionador de ILP o un solucionador de SAT.
DW

@DW Definitivamente estoy interesado en usar el conjunto de sumas en lugar del conjunto múltiple (aunque eso también puede ser un problema interesante). Además, originalmente era un problema de matemática recreativa, por lo que me interesan principalmente los límites de complejidad en lugar de una solución práctica.
Uri Granta

3
Si le dan el conjunto múltiple de sumas, entonces es bastante sencillo hacer esto con avidez (ver por ejemplo math.stackexchange.com/questions/201545/… ).
jschnei

@UriZarfaty el conjunto dado como entrada ya está ordenado? Finalmente esto es set o multiset? El comentario aún sugiere que quieres un conjunto puro.
Evil

Respuestas:


9

Solución

La solución tiene dos partes. Primero descubrimos un conjunto mínimo, luego demostramos que puede representar el conjunto de suma de potencia. La solución se ajusta para la implementación de la programación.

Algoritmo de conjunto mínimo

  1. Encuentre el elemento máximo del conjunto de suma (múltiple). P , el conjunto mínimo potencial (múltiple) está inicialmente vacío.amP

  2. A menos que haya sólo un grupo, representan en todas las formas posibles como un par de sumas que se suman a una m , S i j = { ( a i , un j ) | a i + a j = a m }amamSij={(ai,aj)|ai+aj=am}

  3. Compruebe que todos los elementos del conjunto de sumas estén incluidos.

  4. Encuentre el elemento máximo de todos los S i j (que significan juntos) con la siguiente propiedad: para cada S i j , a s está en S i j , o podemos encontrar una p del conjunto de sumas para que a p + a s está en S i j .asSijSijasSijapap+asSij

  5. Si es el caso de que no contiene una s , solo la suma a s + a p , elimine a p + a s de S i j (o simplemente establezca una marca para ignorarlo) e inserte una p y una s en S i j en su lugar.Sijasas+apap+asSijapasSij

  6. Si un elemento está presente en cada eliminarlo de todo S i j una vez (o acaba de establecer una marca de ignorarlo y no tocar por más tiempo) y añadirlo a la lista de elementos de potencial conjunto mínimo P .SijSijP

  7. Repita hasta que todos estén vacíosSij

  8. Si algo de permanece no vacío y no podemos continuar, intente nuevamente con el valor máximo de todos S i j .SijSij

  9. Recrear los pasos recursivos sin el traslado y continuar con el algoritmo de cobertura de conjunto potencia sobre . (Antes de esto, puede hacer una comprobación segura de que P incluye todos los elementos que no pueden representarse como una suma de dos elementos, por lo que deben estar en el conjunto subyacente con seguridad. Por ejemplo, el elemento mínimo debe estar en P ).PPP

(10. Observe que una solución de conjunto mínima que es el objetivo del algoritmo no puede contener más de una repetición del mismo número).

Ejemplo:

{2,3,5,7,8,10,12,13,15}

Representa 15 en todas las formas posibles como una suma de dos números del conjunto de sumas.

(13,2),(12,3),(10,5),(8,7)

Trate de encontrar el número máximo que está en todos los grupos o que puede representarse como una suma. Obviamente podemos comenzar a buscarlo desde 8, no tiene sentido ir por encima de él.

13 del primer grupo es 13 = 8 + 5, por lo que 13 está bien, pero 12 del segundo grupo no está bien ya que no hay 4 para hacer 12 = 8 + 4 en el conjunto de sumas. Luego intentamos con 7. Pero inmediatamente 13 no puede ser cubierto, no hay 6.

Luego intentamos 5. 13 = 5 + 8, 12 = 5 + 7, 10 = 5 + 5, y para el último 8 = 5 + 3 o 7 = 5 + 2 pero no ambos. Los grupos son ahora:

((5,8),2),((5,7),3),((5,5),5),((5,3),7)

5 se repite en todos los grupos, por lo que lo extraemos . Extraemos 5 solo una vez de cada grupo.P={5}

(8,2),(7,3),(5,5),(3,7)

Obviamente no tiene sentido ir más allá de 5, así que intentamos 5 nuevamente. 8 = 5 + 3, 7 = 5 + 2, entonces todo está bien

((5,3),2),((5,2),3),(5,5),(3,(5,2))

Extraiga un 5 nuevamente de todos los grupos ya que se está repitiendo. (Esto no es común, pero nuestro caso se crea deliberadamente para mostrar qué hacer en caso de que tengamos repeticiones). P={5,5}

(3,2),(2,3),(5),(3,2)

Ahora intentamos con 3 y tenemos 5 = 3 + 2. Agréguelo al grupo.

(3,2),(2,3),(3,2),(3,2)

Ahora extraiga 3 y 2 ya que se repiten en todas partes y estamos bien y los grupos están vacíos.P={5,5,3,2}

(),(),(),()

Ahora, necesitamos recrear pasos recursivos sin eliminaciones, esto simplemente significa hacer lo anterior sin eliminar realmente los elementos de simplemente colocándolos en P y marcando para no alterarlos más.SijP

( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7

(13,2),(12,3),(10,5),(8,7)
( ( 5 , ( 5 , 3 ) ) , 2 ) , ( ( 5 , ( 5 , 2 ) ) , 3 ) , ( ( 5 , ( 3 , 2 ) ) , 5 ) , ( ( 5 , 3 ) , ( 5 , 2 ) )
((5,8),2),((5,7),3),((5,5),5),((5,3),7)
((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

Cobertura de potencia establecida

El propósito de esta parte es verificar si el conjunto mínimo encontrado puede cubrir el conjunto de suma de potencia. Es posible que una solución encontrada pueda cubrir todas las sumas dadas, pero que no sean sumas de potencia establecida. (Técnicamente, podría simplemente crear un conjunto de suma de potencia a partir del conjunto mínimo encontrado y verificar si cada suma, como lo establece el conjunto de potencia, está en el conjunto de suma inicial. Esto es todo lo que se fusionó con lo que ya tenemos, por lo que no se desperdicia nada Puede hacer esta parte mientras rebobina la recursión).

  1. Codifique todos los elementos del conjunto mínimo utilizando potencias sucesivas de 2. El orden no es importante. Codifique el mismo elemento con un nuevo valor tantas veces como se repita. Comience desde C = 1, cada elemento siguiente tiene C = 2C.

(2=[1],3=[2],5=[4],5=[8])
  1. Reemplace los elementos en la lista de recursión restaurada,

((5,(5,3)),2),((5,(5,2)),3),((5,(3,2)),5),((5,3),(5,2))

con la codificación: 2 con 1, 3 con 2, 5 con 4 y otros 5 con 8. Observe que cada elemento tiene una codificación diferente aunque se repitan.

((4,(8,2)),1),((4,(8,1)),2),((4,(2,1)),8),((8,2),(4,1))
  1. Recoge todas las sumas intermedias, en este momento tenemos (1,2,4,8)

((4,(10)),1),((4,(9)),2),((4,(3)),8),((10),(5))

(1,2,3,4,5,8,9,10)

((14),1),((13),2),((7),8),(15)

(1,2,3,4,5,8,9,10,13,14,15)

{(15),(15),(15),(15)}
  1. 2m1mm=4

  2. 12m1

(6,7,11,12)

  1. Justifique su ausencia de la siguiente manera: represente cada número en forma binaria

(6=01102) (7=01112) (11=10112) (12=10102)

601102(2=[1],3=[2],5=[4],5=[8]){2,3,5,7,8,10,12,13,15}Así que todo está bien.

701112(2=[1],3=[2],5=[4],5=[8])

1112

Si alguna representación binaria corresponde a la suma que no se puede encontrar, informe que no hay solución.

(2,3,5,5)

Discusión

Era necesario proporcionar el algoritmo que verificará si las sumas cubren la finalización del conjunto de potencia, que es lo que está oculto en la expansión binaria. Por ejemplo, si excluimos 8 y 7 del ejemplo inicial, la primera parte aún proporcionaría la solución, solo la segunda parte informaría las combinaciones faltantes de sumas.

mnlog(m)mlog2(m)mnlog(m)

mlogmmlog2(m)

mlog3(m)

Partes del algoritmo suponen que podemos encontrar el par de sumas en tiempo lineal y esto requiere una clasificación.

Inicio incorrecto

2,3,4,5,6,7,8,9,10,11,12,13,152,3,4,6Sij

5,4,3,3

2,2,3,4,42,3,4,6

El propósito de este algoritmo es proporcionar una solución una vez que hayamos comenzado todo correctamente.

Mejoras

El paso 4. es el que podría actualizarse de esta manera: en lugar de la máxima, podríamos probar cada elemento en orden descendente que satisfaga la condición dada. Creamos una rama separada para cada uno. Si alguna rama no da una solución, cancélela.

2,3,4,5,6,7,8,9,10,11,12,13,157,6,5,4de manera separada ya que todos pasan la primera prueba. (No hay ninguna razón para usar 2 o 3, ya que sabemos que tienen que estar en el conjunto subyacente) y simplemente continuar de esa manera hasta que recopilemos todas las versiones que puedan llegar al final. Esto crearía una solución de cobertura total que descubriría más de un conjunto subyacente.

Otra cosa, ya que sabemos que no podemos tener más de una repetición si el caso es mínimo, podemos incorporar esto en nuestro algoritmo.

En general, la condición en el paso 4. de que un número debe repetirse en cada grupo o tener la capacidad de crear una suma es lo suficientemente fuerte como para sacarnos de las aguas exponenciales directas, lo que sería un algoritmo de simplemente probar cada combinación y crear la potencia establecer sobre cada uno hasta que encontremos una coincidencia.


1
En términos más generales: veo una descripción textual de un algoritmo, pero (a) sin pseudocódigo, y (b) sin prueba de corrección. ¿Por qué cree que este enfoque proporciona un algoritmo que funcionará correctamente en todas las entradas posibles? ¿Cuál es la justificación? ¿Tiene una prueba de corrección para esto?
DW

Creo que el problema ha tomado alrededor de 30 horas de trabajo en conjunto (30 veces por hora, bueno ...). Pero no hay opción de pago.

Finalmente lee la respuesta con el detalle que merecía. ¡Buen trabajo!
Uri Granta

1

NOTA: Esto no funciona del todo en general, consulte el contraejemplo de Uri a continuación.

YY

  • 0Y
  • yYyXY
  • z1<<znYYY=Y+{0,y}0Yi=1,,nzi+yYziYziyYzi+yYzi+yYziY
  • Yy,y,

1yO(n)O(n2)

Y={0,1,3,4,5,6,7}{0,1,3,4,6}{0,1,3,5,6}yY{a+ky}YY


¿Es obvio que Y 'no conduce a un callejón sin salida? Después de todo, puede haber muchas Y de manera que Y = Y '+ {0, y}. Por ejemplo {0,1,2,3,4} = {0,2,3} + {0,1} = {0,1,2,3} + {0,1} pero la descomposición anterior conduce a un callejón sin salida.
Uri Granta

Eso es cierto y es un problema real. Tendré que ver si se puede arreglar. ¡Gracias!
Klaus Draeger

YkY=Y+{0,y,,y}{0,y,,y}kyY
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.