Sous-ensemble: réduire le cas spécial au cas général


20

Wikipedia indique que le problème de la somme des sous-ensembles consiste à trouver un sous-ensemble d'un multiset donné d'entiers, dont la somme est nulle. De plus, il déclare qu'il revient à trouver un sous-ensemble avec la somme s pour tout s donné .

Je pense donc que comme ils sont équivalents, il doit y avoir une réduction de chaque côté. Celui de s à zéro est trivial en mettant s=0 . Mais je n'ai pas eu de chance de trouver une réduction de zéro à s , c'est-à-dire étant donné un ensemble d'entiers A , construire un ensemble d'entiers B contenant un sous-ensemble avec la somme s (pour tout s ), si et seulement s'il y a comme sous-ensemble de A avec somme zéro.

Pouvez-vous me donner quelques conseils?

Réponses:


11

En fait, vous avez déjà une réduction de spécial à général. En définissant s=0 , vous utilisez essentiellement l'algorithme général pour résoudre le problème spécial.

Pour l'inverse (c'est-à-dire une réduction du général au spécial):

Supposons que vous êtes donné un ensemble S={x1,,xn} et un nombre K et vous devez déterminer s'il y a un sous - ensemble de S qui sommes à K .

Maintenant, vous voulez résoudre ce problème, étant donné un algorithme pour le cas où vous pouvez déterminer si certains sous-ensembles totalisent 0 .

Or si xi>0 , on a une réduction facile: S={x1,x2,,xn,K} .

a un sousensemble de somme 0 iff S disposeun sousensemble de somme K .S0SK

Le problème se produit lorsque nous pouvons avoir pour certains des i .xi0i

Nous pouvons supposer que (pourquoi?).K>0

Supposons que la somme des valeurs positives est P et le négatif ix i est N .xiPxiN

Construisons maintenant un nouvel ensemble tel queS={y1,y2,yn}

M = P + | N | + K .yi=xi+MM=P+|N|+K

Chaque .yi>0

Exécutez maintenant l'algorithme de somme de sous-ensemble zéro sur les ensembles

S{(K+M)}

S{(K+2M)}

S{(K+3M)}

S{(K+nM)}

Il est facile de montrer que si a un sous-ensemble de somme K , alors au moins l'un des ensembles ci-dessus a un sous-ensemble de somme zéro.SK

Je vous laisse la preuve de l'autre sens.


Merci beaucoup. Je me demande, y a-t-il une réduction qui transforme une instance de somme de sous-ensemble 0 en une (au lieu de ) instance de somme de sous-ensemble K? n
ipsec

@ipsec: Vous voulez dire transformer une instance de K-subset-sum en 0-subset-sum? Peut-être que la prise de l'union des ensembles ci-dessus fonctionnera. n
Aryabhata

Eh bien, je réfléchissais à deux fois si j'avais maintenant la bonne direction. Quand je veux montrer que la somme de sous-ensemble K est NP-difficile pour chaque K étant donné le fait, que la somme de sous-ensemble 0 est NP-difficile, je peux utiliser une réduction de la somme de 0 sous-ensemble à la somme de sous-ensemble K , pour lequel j'aurais besoin d'une transformation poly-temps de n'importe quelle instance 0 à une instance K. Mais je ne suis pas certain maintenant que c'est bien ce que j'ai demandé dans ma question.
ipsec

@ipsec: Quand vous dites set , vous avez montré la NP- Hardness de K -subset-sum étant donné la NP-Hardness de zero-subset-sum: le problème général est au moins aussi difficile que le problème spécial. Notez que en termes de réduction, vous dites que vous avez réduit à somme zéro sous - ensemble de K -subset somme. Notez également que K est une entrée . Quand vous parlez de "chaque K donné ", que voulez-vous dire exactement? Les émissions de réponse ci - dessus que le cas particulier (de somme zéro sous - ensemble) est aussi difficile (dans le sens NP-dureté) que le cas général ( k -subset-somme, où k est une entrée). s=0KKKKkk
Aryabhata

Ça ne fait rien. Ce que je me demandais à l'origine, c'est si nous savons que la somme de 0 sous-ensemble est NP-difficile, pouvons-nous en déduire que, par exemple, la somme de 1 sous-ensemble l'est également? Wikipédia le dit, mais je cherchais une réduction appropriée. Cependant, je vois maintenant que ma formulation était totalement foirée et je demandais en fait le contraire. Quoi qu'il en soit, vous m'avez donné suffisamment de données pour passer d'une instance de somme de sous-ensemble K à une instance de somme de sous-ensemble L pour n'importe quel entier K et L, donc mon problème est toujours résolu.
ipsec

0

La réponse d'Aryabhata peut être corrigée en utilisant le fait que nous pouvons multiplier tous les nombres par un grand c , puis ajouter quelque chose de petit à chacun pour agir comme une "balise de présence", puis fournir des nombres supplémentaires qui permettront nous pour arriver à zéro si nous pouvions arriver à cK sans eux. Plus précisément, nous utiliserons c=2(n+1) et 1 comme balise de présence.

Étant donné une instance (S={x1,,xn},K) du problème général avec la valeur cible K , nous allons créer une instance du problème spécifique (avec la valeur cible 0) qui contient:

  • Y={y1,,yn} , oùyi=2(n+1)xi+1 .
  • Le nombre z=2K(n+1)n .
  • n1 exemplaires du numéro 1, appelés numéros "pull-up".

Je suppose qu'Aryabhatta fait que K est positif. (Comme cela fait 6 ans, je répondrai à son exercice pour le lecteur: la raison pour laquelle nous pouvons le faire est que si nous échangeons les signes de tous les nombres dans une instance du problème général, y compris K , nous nous retrouvons avec un nouvelle instance de problème équivalente. Cela signifie qu'un algorithme pour résoudre des instances K positives suffit à résoudre n'importe quel problème - pour résoudre une instance avec K négatif , nous pourrions effectuer cet échange de signe, exécuter cet algorithme et transmettre sa réponse en tant que la réponse à la question d'origine. Et bien sûr, si K=0 alors nous n'avons pas du tout besoin de transformer le cas général en cas spécial!)

Montrons d'abord qu'une réponse OUI à l'instance donnée du problème général implique une réponse OUI à l'instance construite du problème spécial. Ici , nous pouvons supposer que une solution {xj1,,xjm} au problème général existe: qui est, cette collection non vide de m nombres sommes à K . Donc, si nous prenons les valeurs y correspondantes {yj1,,yjm} dans notre solution à l'instance construite, elles totaliseront 2K(n+1)+m . On peut alors choisir d'inclure2K(n+1)n dans la solution, ce qui nous laisse une somme demn . Puisque1mn , ceci dans la gamme[n+1,0] , que nous pouvons réussir à tirer jusqu'à 0 en incluant un sous-ensemble des nombres de pull-up.

Montrons maintenant qu'une réponse OUI à l'instance construite implique une réponse OUI à l'instance donnée d'origine. C'est là que la multiplication par 2(n+1) devient importante - c'est ce qui nous permet d'être certains que les nombres supplémentaires que nous avons inclus ne peuvent pas "faire trop".

Ici, nous pouvons supposer qu'il existe une solution {yj1,,yjm} à l'instance construite: c'est-à-dire que cette collection non vide de m égale à 0. Par les exigences du problème, cette solution contient à au moins un élément. De plus, il doit contenir au moins un élément de Y , car sans cela, il est impossible d'atteindre un total de 0: si seuls des nombres de pull-up sont présents, alors la somme est nécessairement dans la plage [1,n1] ( notez que dans ce cas au moins unle nombre de pull-up doit être présent, et tous sont strictement positifs, donc la somme ne peut pas être 0); alors que si la solution se compose uniquement de z et de quelques nombres de pull-up, alors le total est nécessairement négatif parce que z=2K(n+1)nn et le plus que les nombres de pull-up peuvent augmenter la somme par est n1 .

Now suppose towards contradiction that the solution does not contain z. Every element in Y consists of two terms: A multiple of 2(n+1), and a +1 "presence tag". Notice that the +1 term on each of the n elements of Y increases the sum by 1 if that element is chosen, as does each of the up to n1 pull-up numbers that are chosen, so the total contributed by these 2 sources to any solution is at least 1 (because we established in the previous paragraph that at least one element of Y must be chosen) and at most n+n1=2n1. In particular, this implies that the sum of these two sets of terms, when taken modulo 2(n+1), is nonzero. Under the assumption that the solution does not contain z, the only other components in this sum are the multiples of 2(n+1) contributed by the chosen members of Y, which do not affect the value of the sum when taken modulo 2(n+1). Thus the sum of all terms in the solution, when taken modulo 2(n+1), is nonzero, meaning it cannot be equal to the target sum of 0, meaning it cannot be a valid solution at all: we have found a contradiction, meaning that it must be that z=2K(n+1)n is present in every solution after all.

So every solution contains z. We know that

(2K(n+1)n)+i=1m(2(n+1)xji+1)+pull-ups=0,

and we can rearrange the terms:

2K(n+1)+i=1m(2(n+1)xji)(n+i=1m1+pull-ups)=0

2K(n+1)+i=1m(2(n+1)xji)(n+m+pull-ups)=0

2(n+1)(K+i=1mxji)(n+m+pull-ups)=0.

Since the sum is 0, it must remain 0 when taken modulo 2(n+1), which implies that we can discard all terms containing a multiple of 2(n+1) to obtain the new equation

(n+m+pull-ups)=0.

This can be directly substituted back into the previous equation to get

2(n+1)(K+i=1mxji)=0.

Finally, dividing both sides by 2(n+1) leaves

K+i=1mxji=0,

which yields a solution to the original general problem instance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.