Diciamo che il tuo set "grande" è chiamato bigSet
e la tua serie di insiemi è chiamata arrayOfSets.
1. Passa attraverso tutti gli elementi di tutti i set in arrayOfSets
e ricorda quante volte hai trovato ogni numero da bigSet
in questi set. Supponiamo che tu memorizzi queste informazioni in count (che dovrebbe essere un dizionario se bigSet non è ordinato, che non dovrebbe essere per definizione ... oppure puoi rendere il bigSet
ordinato copiandolo in una matrice o qualcosa del genere ).
2. Se hai trovato qualche numero zero volte (ovvero se count(bigSet[i])
è 0 per alcuni i), bigSet
non può essere generato da arrayOfSets
.
3. Ripassa di nuovo arrayOfSets
e ogni volta che trovi un numero da bigSet il cui conteggio in arrayOfSets è min{count(bigSet[1]), count(bigSet[2]),..., count(bigSet[n])}
, elimina quel set da arrayOfSets
e diminuisci il numero di volte in cui ogni numero da quell'array appare in arrayOfSets
. Se il conteggio di alcuni numeri raggiunge 0 dopo averlo fatto, e se non è il numero che hai appena trovato, bigSet non può essere generato. "Elimina" (cancella o in qualche modo "segna" così sai che non dovresti più considerarlo) il numero che hai appena trovato da bigSet
e riavvia questo passaggio. Ricorda il set da cui hai preso quel numero (se vuoi ricreare la soluzione in seguito)
4. Se bigSet è vuoto (tutti i numeri da esso sono stati eliminati), puoi generare bigSet da arrayOfSets
.
5. Ripeti 3. - 4.
Esempio:
(Sto usando l'indicizzazione basata su 1)
bigSet = {10,4,8,1,7}
arrayOfSets = [{10,4}, {10,8,12,7},{1,5},{9,7},{7}]
Go through arrayOfSets and get:
count(10) = 2
count(4) = 1
count(8) = 1
count(1) = 1
count(7) = 3
min(count()) = 1 so go through arrayOfSets searching for numbers from {4,8,1}.
arrayOfSets[1] contains 4, so you delete arrayOfSets[1] from arrayOfSets, delete 4 from bigSet and decrease count for 4 and 10.
After this, you have:
bigSet = {10,8,1,7}
arrayOfSets = [{SKIPME},{10,8,12,7},{1,5},{9,7},{7}]
count(10) = 1
count(8) = 1
count(1) = 1
count(7) = 3
min(count()) = 1 so go through arrayOfSets searchinig for numbers from {10,8,1}.
arrayOfSets[2] contains 8 so, following the same procedure, you get:
bigSet = {10,1,7}
arrayOfSets = [{SKIPME},{SKIPME},{1,5},{9,7},{7}]
count(10) = 0
count(1) = 1
count(7) = 3
bigSet can't be generated from arrayOfSets because count(10) = 0.