Somma sottoinsieme: riduce il caso speciale al caso generale


20

Wikipedia afferma che il problema della somma dei sottoinsiemi è trovare un sottoinsieme di un dato multiset di numeri interi, la cui somma è zero. Inoltre afferma che equivale a trovare un sottoinsieme con somma per ogni dato .ss

Quindi, poiché sono equivalenti, deve esserci una riduzione in entrambe le parti. Quello da a zero è banale impostando . Ma non ho avuto fortuna a trovare una riduzione da zero a , ovvero dato un insieme di numeri interi , costruisco un insieme di numeri interi contenente un sottoinsieme con somma (per qualsiasi ), se e solo se esiste un sottoinsieme di con somma zero.ss=0sABssA

Puoi darmi qualche suggerimento?

Risposte:


11

In realtà hai già una riduzione da speciale a generale. Impostando , stai sostanzialmente usando l'algoritmo generale per risolvere il problema speciale.s=0

Per il contrario (ovvero una riduzione da generale a speciale):

Supponiamo che si sta dato un insieme e un numero e si deve determinare se c'è qualche sottoinsieme di quali somme a .K S KS={x1,,xn}KSK

Ora vuoi risolvere questo problema, dato un algoritmo per il caso in cui puoi determinare se alcuni sottoinsiemi si sommano a .0

Ora se , abbiamo una facile riduzione: .S = { x 1 , x 2 , , x n , - K }xi>0S={x1,x2,,xn,K}

S è un sottoinsieme di somma se e solo se ha un sottoinsieme di somma .S K0SK

Il problema si verifica quando possiamo avere per alcuni dei .ixi0i

Possiamo supporre che (perché?).K>0

Supponiamo che la somma del positivo è e il negativo è . P x i NxiPxiN

Ora costruisci un nuovo set tale cheS={y1,y2,yn}

M = P + | N | + Kyi=xi+M dove .M=P+|N|+K

Ogni .yi>0

Ora esegui l'algoritmo zero-subset-sum sui set

S{(K+M)}

S{(K+2M)}

S{(K+3M)}

S{(K+nM)}

È facile dimostrare che se ha un sottoinsieme della somma , almeno uno dei set sopra ha un sottoinsieme della somma zero.KSK

Lascerò a te la prova dell'altra direzione.


Grazie mille. Mi chiedo, c'è una riduzione che trasforma un'istanza di 0-subset-sum in un'istanza (anziché ) di K-subset-sum? n
ipsec,

@ipsec: Intendi trasformare un'istanza di K-subset-sum in 0-subset-sum? Forse prendere l'unione degli set sopra funzionerà. n
Aryabhata,

Beh, in realtà stavo pensando due volte se ho ottenuto la giusta direzione adesso. Quando voglio mostrare che K-subset-sum è NP-hard per ogni K dato il fatto, che 0-subset-sum è NP-hard, posso usare una riduzione da 0-subset-sum a K-subset-sum , per il quale avrei bisogno di una trasformazione poly-time da qualsiasi istanza 0 a un'istanza K. Ma non sono sicuro ora che questo è in realtà quello che ho chiesto nella mia domanda.
ipsec,

@ipsec: quando dici set , hai mostrato la durezza NP della somma K -subset data la durezza NP della somma-sottoinsieme zero: il problema generale è almeno difficile quanto il problema speciale. Si noti che, in termini di riduzione, dite che avete ridotto zero sottoinsieme somma di K -subset-sum. Inoltre, nota che K è un input . Quando parli di "ogni dato K " cosa intendi esattamente? La risposta sopra mostra che il caso speciale (somma di sottoinsieme zero) è duro (nel senso della durezza NP) come il caso generale ( somma di sottoinsieme k , dove k è un input). s=0KKKKKK
Aryabhata,

Non importa. Ciò che inizialmente mi chiedevo è, se sappiamo che la somma di 0 sottoinsiemi è NP-difficile, possiamo ricavare che lo è anche la somma di 1 sottoinsieme? Wikipedia lo dice, ma stavo cercando una riduzione adeguata. Tuttavia ora vedo che la mia formulazione era totalmente incasinata e in effetti chiedevo il contrario. Comunque mi hai dato abbastanza input per ridurre da qualsiasi istanza K-subset-sum a un'istanza L-subset-sum per qualsiasi dato intero K e L, quindi il mio problema è ancora risolto.
ipsec,

0

La risposta di Aryabhata può essere risolta sfruttando il fatto che possiamo moltiplicare tutti i numeri per qualche grande c , quindi aggiungere qualcosa di piccolo a ciascuno per agire come un "tag di presenza", e quindi fornire alcuni numeri extra che consentiranno per arrivare a zero se potessimo arrivare a cK senza di loro. In particolare, useremo c=2(n+1) e 1 come tag di presenza.

Data un'istanza (S={X1,...,Xn},K) del problema generale con valore target K , creeremo un'istanza del problema specifico (con valore target 0) che contiene:

  • Y={y1,...,yn} , doveyio=2(n+1)Xio+1 .
  • Il numero z=-2K(n+1)-n .
  • n-1 copie del numero 1, da chiamare numeri "pull-up".

Presumo che Aryabhatta faccia che K è positivo. (Dato che sono passati 6 anni, risponderò al suo esercizio per il lettore: la ragione per cui possiamo farlo è che se scambiamo i segni di tutti i numeri in un'istanza del problema generale, incluso K , allora finiamo con un nuova istanza del problema equivalente. Ciò significa che un algoritmo per risolvere istanze K positive è sufficiente per risolvere qualsiasi problema: per risolvere un'istanza con K negativa , potremmo eseguire questo scambio di segni, eseguire quell'algoritmo e inoltrare la sua risposta come la risposta alla domanda originale. E ovviamente se K=0 quindi non è necessario eseguire alcuna trasformazione del caso generale nel caso speciale!)

Innanzitutto mostriamo che una risposta SÌ alla determinata istanza del problema generale implica una risposta SÌ all'istanza costruita del problema speciale. Qui possiamo supporre che qualche soluzione {Xj1,...,Xjm} al problema generale esiste: che è, questa collezione non vuoto di m numeri somme a K . Quindi se prendiamo i corrispondenti valori y{yj1,...,yjm} nella nostra soluzione all'istanza costruita, si sommeranno a 2K(n+1)+m . Possiamo quindi scegliere di includere-2K(n+1)-n nella soluzione, lasciandoci con una somma dim-n . Dal momento che1mn , questo è compreso nell'intervallo[-n+1,0] , che possiamo estrarre con successo fino a 0 includendo alcuni sottogruppi dei numeri di pull-up.

Ora mostriamo che una risposta SÌ all'istanza costruita implica una risposta SÌ all'istanza data originale. È qui che la moltiplicazione per 2(n+1) diventa importante - è ciò che ci consente di essere certi che i numeri extra che abbiamo incluso non possano "fare troppo".

Qui possiamo supporre che esista qualche soluzione {yj1,,yjm} all'istanza costruita: ovvero, questa raccolta non vuota di m numeri si somma a 0. Per i requisiti del problema, questa soluzione contiene almeno un elemento. Inoltre, deve contenere almeno un elemento di Y , poiché senza questo è impossibile raggiungere un totale di 0: se sono presenti solo numeri pull-up, la somma è necessariamente nell'intervallo [1,n1] ( notare che in questo caso almeno unoil numero di pull-up deve essere presente e tutti sono strettamente positivi, quindi la somma non può essere 0); mentre se la soluzione consiste solo di z e di alcuni numeri di pull-up, allora il totale è necessariamente negativo perché z=2K(n+1)n-n e il più che i numeri di pull-up possono aumentare la somma da è n-1 .

Supponiamo ora alla contraddizione che la soluzione non contenga z . Ogni elemento in Y costituito da due termini: un multiplo di 2(n+1) e un +1 "tag presenza". Si noti che il termine +1 su ciascuno degli n elementi di Y aumenta la somma di 1 se si sceglie quell'elemento, così come ciascuno dei numeri pull-up fino a n-1 scelti, quindi il totale contribuito da questi 2 le fonti per qualsiasi soluzione sono almeno 1 (perché abbiamo stabilito nel paragrafo precedente che deve essere scelto almeno un elemento di Y ) e al massimo n+n-1=2n-1 . In particolare, ciò implica che la somma di questi due insiemi di termini,se presa modulo2(n+1) , è diversa da zero. Partendo dal presupposto che la soluzione non contengaz , gli unici altri componenti di questa somma sono i multipli di2(n+1) forniti dai membri scelti diY , che non influiscono sul valore della somma quando presa modulo2(n+1) . Quindi la somma di tutti i termini nella soluzione, se presa modulo2(n+1) , è diverso da zero, il che significa che non può essere uguale alla somma target di 0, il che significa che non può essere affatto una soluzione valida: abbiamo trovato una contraddizione, nel senso che deve essere chez=-2K(n+1)-n è presente in ogni soluzione dopo tutto.

Quindi ogni soluzione contiene z . Lo sappiamo

(-2K(n+1)-n)+Σio'=1m'(2(n+1)Xjio''+1)+Σpull-up=0 ,

e possiamo riorganizzare i termini:

-2K(n+1)+Σio'=1m'(2(n+1)Xjio'')-(n+Σio'=1m'1+Σpull-up)=0

-2K(n+1)+Σio'=1m'(2(n+1)Xjio'')-(n+m'+Σpull-up)=0

2(n+1)(-K+Σio'=1m'Xjio'')-(n+m'+Σpull-up)=0 .

Dato che la somma è 0, deve rimanere 0 se presa modulo 2(n+1) , il che implica che possiamo scartare tutti i termini contenenti un multiplo di 2(n+1) per ottenere la nuova equazione

-(n+m'+Σpull-up)=0 .

Questo può essere sostituito direttamente nell'equazione precedente per ottenere

2(n+1)(-K+Σio'=1m'Xjio'')=0 .

Infine, dividendo entrambi i lati per 2(n+1) foglie

-K+Σio'=1m'Xjio''=0 ,

che fornisce una soluzione all'istanza del problema generale originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.