Suma del producto sobre todas las combinaciones con un elemento de cada grupo

StackOverflow https://stackoverflow.com/questions/2097988

  •  21-09-2019
  •  | 
  •  

Pregunta

Dado que tengo conjuntos distintos m no vacías (Z marcado [1], Z [2], ..., Z [m]), mi objetivo para calcular la suma de todos los subconjuntos posibles, donde hay exactamente una elemento de cada conjunto. El tamaño de cada subconjunto se define para ser el producto de sus miembros. Por ejemplo:

Z[ 1 ] = {1,2,3}

Z[ 2 ] = {4,5}

Z[ 3 ] = {7,8}

En caso de resultar en:

1*4*7 + 1*4*8 + 1*5*7 + 1*5*8 + 2*4*7 + 2*4*8 + 2*5*7 + 2*5*8 + 3*4*7 + 3*4*8 + 3*5*7 + 3*5*8 = 810

Si bien esto es fácil de código (en cualquier idioma), se trata de una actualización del famoso suma subconjunto problema? Si no es así, por favor proporcione un algoritmo de tiempo polinomial que calcula esta suma (pseudo-código o pitón preferido!). Si no existe un algoritmo de tiempo polinomial explique por qué.

¿Fue útil?

Solución

Es fácil ver que (1 + 2 + 3) * (4 + 5) * (7 + 8) = 810.

>>> from operator import mul
>>> from functools import reduce
>>> z = [{1,2,3}, {4,5}, {7,8}]
>>> s = reduce(mul, (sum(zz) for zz in z))
>>> s
810

¿Cuál es la función de Python como suma (), pero para la multiplicación ? producto ()?

Yo personalmente creo que Guido hizo una terrible decisión con respecto mul.

Otros consejos

>>> z1 = [1, 2, 3]
>>> z2 = [4, 5]
>>> z3 = [7, 8]
>>> s = 0
>>> for a in z1:
        for b in z2:
            for c in z3:
                s += a*b*c      
>>> s
810
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top