Dado un conjunto múltiple de números naturales X, considere el conjunto de todas las sumas posibles:
Por ejemplo, mientras que .
¿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:
- Si un conjunto dado es un conjunto válido de sumas. (Por ejemplo, es válido pero no lo es).
- Un conjunto múltiple que suma al conjunto dado.
- El multiset más pequeño que se suma al conjunto dado. (Por ejemplo, y ambos suman pero el primero es más pequeño).
algorithms
optimization
combinatorics
integers
Uri Granta
fuente
fuente
Respuestas:
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
Encuentre el elemento máximo del conjunto de suma (múltiple). P , el conjunto mínimo potencial (múltiple) está inicialmente vacío.unametro PAGS
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 }unametro unametro Syo j= { ( ayo, unaj) | unayo+ aj= ametro}
Compruebe que todos los elementos del conjunto de sumas estén incluidos.
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 .unas Syo j Syo j unas Syo j unapags unapags+ as Syo j
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.Syo j unas unas+ apags unapags+ as Syo j unapags unas Syo j
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 .Syo j Syo j PAGS
Repita hasta que todos estén vacíosSyo j
Si algo de permanece no vacío y no podemos continuar, intente nuevamente con el valor máximo de todos S i j .Syo j Syo j
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 ).PAGS PAGS PAGS
(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:
Representa 15 en todas las formas posibles como una suma de dos números del conjunto de sumas.
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 se repite en todos los grupos, por lo que lo extraemos . Extraemos 5 solo una vez de cada grupo.PAGS= { 5 }
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
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).PAGS= { 5 , 5 }
Ahora intentamos con 3 y tenemos 5 = 3 + 2. Agréguelo al grupo.
Ahora extraiga 3 y 2 ya que se repiten en todas partes y estamos bien y los grupos están vacíos.PAGS= { 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.Syo j PAGS
( ( 5 , 8 ) , 2 ) , ( ( 5 , 7 ) , 3 ) , ( ( 5 , 5 ) , 5 ) , ( ( 5 , 3 ) , 7
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).
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.
Si alguna representación binaria corresponde a la suma que no se puede encontrar, informe que no hay solución.
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.
Partes del algoritmo suponen que podemos encontrar el par de sumas en tiempo lineal y esto requiere una clasificación.
Inicio incorrecto
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.
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.
fuente
NOTA: Esto no funciona del todo en general, consulte el contraejemplo de Uri a continuación.
fuente