2010-01-19 12 views
0

Étant donné que j'ai m ensembles distincts non vides (étiquetés Z [1], Z [2], ..., Z [m]), je vise pour calculer la somme de tous les sous-ensembles possibles où il y a exactement un élément de chaque ensemble. La taille de chaque sous-ensemble est définie comme étant le produit de ses membres. Par exemple:Somme du produit sur toutes les combinaisons avec un élément de chaque groupe

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

Z[ 2 ] = {4,5}

Z[ 3 ] = {7,8}

devrait se traduire par:

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

Bien que ce soit facile à coder (dans toutes les langues), est-ce retraitement du fameux subset sum problem? Sinon, veuillez fournir un algorithme de temps polynomial qui calcule cette somme (pseudo-code ou python préféré!). S'il n'existe pas d'algorithme de temps polynomial, veuillez expliquer pourquoi.

+1

Ce sont des devoirs, n'est-ce pas? –

+0

polynôme en termes de m? Ou le nombre total d'éléments dans tous les Z? – recursive

+0

@ Ipthnc - Ce n'est pas une question de devoirs mais un vrai problème de physique que j'ai rencontré. Supposons que vous avez de nombreux systèmes fermés non identiques (Z1, Z2, ...) tous couplés au même réservoir (à T fixe). Maintenant observez chaque système une seule fois, avec ces observations quel est le T le plus probable du réservoir? Je l'ai reformulé comme une question de calcul dans l'espoir que les majors CS ont plus de perspicacité que moi. – Hooked

Répondre

4

Il est facile de voir 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 

What's the Python function like sum() but for multiplication? product()?

Je pense personnellement que Guido a fait une décision terrible concernant mul.

+0

Et là j'ai pensé que le problème était difficile - tout est beaucoup plus facile (et évident) avec le recul! Merci Ipthnc! – Hooked

+0

Pas de problème :) 15 char –

+0

Bonne réponse! (I + 1ed.) FYI: notez que ce type d'opération - "J'ai N ensembles, et je veux faire des combinaisons où j'ai un membre de chacun des N ensembles" - est appelé "prendre la Produit cartésien "des ensembles. (Le fait que vous multipliez ensuite les membres - et trouvez le "produit" - est une coïncidence.) –

0
>>> 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 
+1

Naïvement cela fonctionne, mais cela croît exponentiellement avec le nombre de termes dans les deux | Z_i | et m et ne répond pas à la question. – Hooked