Questo non è un algoritmo particolarmente intelligente, ma è polinomiale e penso che dovrebbe funzionare. Prendi qualsiasi set. Per ogni elemento in questo set, conta il numero di set rimanenti che non lo contengono e ricorda quali set lo contengono. Scegli l'elemento con il conteggio più alto e rifai i conteggi per gli elementi rimanenti, ignorando i set che mancano dell'elemento che hai appena scelto. Continua fino a quando tutti i set rimanenti sono stati eliminati dalla considerazione.
Esempio: let , , e . Quindi abbiamo conteggi , e . Scegliamo 1, eliminando gli insiemi e che non lo contenevano; rifacendo i conteggi, abbiamo e . Scegliamo 2 come elemento successivo e rimuoviamo dalla considerazione. Ora abbiamo finito e il nostro set di "impronte digitali" è . EDIT: per completare l'esempio, dovresti ottenere gli altri set di impronte digitali come ,A = { 1 , 2 , 3 }B = { 2 , 3 , 4 }C= { 2 , 4 , 6 }D = { 1 , 3 , 5 }c1= 2c2= 1c3= 1BCc2= 1c3= 0D{ 1 , 2 }{ 3 , 4 }{ 6 } e .{ 5 }
Non ci ho pensato molto, ma intuitivamente, sembra che dovrebbe funzionare. L'idea è quella di prendere avidamente come elemento successivo dell'impronta digitale impostare l'elemento che copre i set più scoperti.