2010-05-06 10 views
5

Abbiamo una raccolta di set A_1, .., A_n. L'obiettivo è trovare nuovi set per ciascuno dei vecchi set.Ricerca di sottoinsiemi che possono essere completati per tuple senza duplicati

newA_i = {a_i in A_i such that there exist (a_1,..,a_n) in (A1,..,An) with no a_k = a_j for all k and j} 

Quindi, in parole questo dice di rimuovere tutti gli elementi da A_i che non possono essere usati per formare una tupla (a_1, .. a_n) dai set (A_1, .., a_n) tale che la tupla non contiene duplicati.

La mia domanda è come calcolare rapidamente questi nuovi set. Se implementi questa definizione generando tutte le possibili v, ciò richiederà un tempo esponenziale. Conosci un algoritmo migliore?

Modifica: ecco un esempio. Prendere

A_1 = {1,2,3,4} 
A_2 = {2}. 

Ora i nuovi set di simile a questa:

newA_1 = {1,3,4} 
newA_2 = {2} 

Il 2 è stato rimosso dal A_1 perché se si sceglie la tupla sarà sempre (2,2), che non è valido perché contiene duplicati. D'altra parte 1,3,4 sono validi perché (1,2), (3,2) e (4,2) sono tuple valide.

Un altro esempio:

A_1 = {1,2,3} 
A_2 = {1,4,5} 
A_3 = {2,4,5} 
A_4 = {1,2,3} 
A_5 = {1,2,3} 

Ora i nuovi set sono:

newA_1 = {1,2,3} 
newA_2 = {4,5} 
newA_3 = {4,5} 
newA_4 = {1,2,3} 
newA_5 = {1,2,3} 

Il 1 e 2 vengono rimossi dal set di 2 e 3 perché se si sceglie l'1 o 2 da questi set si Avrai solo 2 valori per i set 1, 4 e 5, quindi avrai sempre duplicati in tuple che assomigliano a (_,1,_,_,_) o simili a (_,_,2,_,_).

Questo problema sembra difficile, ma sarebbe bello se esistesse un algoritmo del tempo polinomiale.

Un altro modo per osservare questo è di visualizzare i set A_i a sinistra ei valori a destra, con una linea che collega un set e un valore se il valore è nell'insieme.

+1

stai scrivendo un risolutore kakuro/sudoku?Se è così, hai dei limiti sui possibili valori, come ad esempio 1 - 9, ci sono sempre al massimo 9 set, quel genere di cose? – clahey

+0

Buona ipotesi :) Non è per sukodu ma è * per * un tipo di risolutore/generatore di puzzle logico (per verificare se esiste una soluzione unica). Non esiste un limite fisso per il numero di serie o quanti elementi ci sono nei set, ma questi numeri saranno in pratica piccoli (diciamo meno di 20). Ma ancora 20^20 è un gran numero di tuple da controllare! – Jules

+0

Suppongo che potrebbero esserci diverse soluzioni valide? In questo caso, stai cercando una soluzione ottimale in un certo senso? – aioobe

risposta

2

Penso che l'algoritmo di assegnazione potrebbe aiutare qui. Il passo base sarebbe quello di correggere un numero in uno dei Ai e poi vedere se quel numero può essere usato con altri scelti dall'Aj per selezionare un numero da ciascun set senza ripetere. Pensa ai numeri come persone e ai numeri nel set Aj come le persone che potrebbero essere utilizzate per eseguire l'attività j. Quindi il problema di trovare un rappresentante diverso da ciascun Aj è il problema di assegnare una persona diversa a ciascuna attività.

Wikipedia tratta il problema dell'assegnazione come se avessero tutte le assegnazioni possibili e un costo per ogni http://en.wikipedia.org/wiki/Assignment_problem. Nel nostro caso possiamo usare 0 e 1 come i costi per significare possono fare e non possono fare e cercare di vedere se c'è una risposta a costo zero.

+0

Grazie! Ho fatto clic su alcuni collegamenti in wikipedia e ho scoperto che esiste persino un algoritmo specializzato per i pesi 0 e 1 (massimale corrispondenza bipartito). Perfezionare. – Jules

+0

Stavo pensando che questo trova semplicemente una soluzione se ne esiste una, ma basta modificare il grafico per includere solo il bordo tra A_i e x nella mia descrizione qui sotto e usare l'algoritmo per cercare di trovare un grafico completo. Se ne trovi uno, includi quella x in B_i e, in caso contrario, la lasci fuori. Eccezionale. Sto codificando completamente questo per il mio risolutore di sudoku. Mi chiedo se posso trovare un modo per usarlo per un risolutore di kakuro. Non so come includere la sezione somma però. – clahey

+0

Ma prima devo capire l'algoritmo. – clahey

2

Sto ancora pensando a come risolvere questo problema, ma ho deciso di provare a riscrivere la domanda per vedere se mi dava ispirazione.

Dato un insieme di N imposta:

A_i = {a_i0, a_i1, ..., a_ij, ...} 

trovare

B_i such that x is in B_i if and only if: 
    x is in A_i and 
    there exists {c_0, c_1, c_2, c_3, ..., c_N} such that 
     c_i = x and 
     c_k is in A_k for all k and 
     c_k != c_l for all k != l