Ho bisogno di aiuto con l'algoritmo su cui sto lavorando, il mio problema ha 3 componenti principali:
Elemento : un oggetto con 2 campi
{
Integer reward;
Boolean_2D_Array area;
}
Generatore : un modulo che genera elementi secondo determinate logiche.
Raccolta : dove tengo gli articoli generati
Per ogni articolo che arriva dal Generatore ho bisogno di decidere una delle seguenti opzioni:
- entra nella raccolta
- Lo butto via
- Lancio altro oggetto dalla raccolta e lo metto invece
La decisione viene presa in base a criteri "preferibili", l'articolo A è preferibile all'articolo B iff:
- A.reward > = B.reward
-
B.area è un sottoinsieme di A.area - Questa regola significa anche che non esiste un valore True in B che è False in A, può essere achive come:
XOR (A.area, OR (A.area, B.area)) == 0
nell'esempio:
A B
0011 0001
0011 0011
1111 0111
nell'esempio sopra B.area è un sottoinsieme di A.area ma A.area non è un sottoinsieme di B.area.
Quindi, se ottengo l'articolo dal generatore, e lì non è preferibile a nessun altro elemento, allora lo metto nella raccolta, In un caso preferibile - manterrò solo uno degli articoli. per esempio, se il precedente A viene dal generatore e io ho B nella mia collezione, butto B dalla raccolta e manterrò A (assumendo la stessa ricompensa per entrambi).
Il mio problema: come gestire la raccolta?
Come prima implementazione ho una semplice lista collegata, e per ogni articolo che ottengo dal generatore passo iterato su tutti gli articoli esistenti e controllo la preferenza in base alla dimensione e sottoinsieme della ricompensa, ma c'è un modo migliore? come posso conservare gli articoli in un modo che mi consenta di saltare alcuni dei controlli di sottoinsiemi? Voglio dire, nella mia implementazione personale faccio controlli O (n ^ 2), c'è un modo per archiviare gli elementi in un'altra struttura dati che conserveranno le informazioni relative all'area e riducendo così i controlli necessari?
P.S. Tutti i valori True nell'area dell'oggetto sono collegati (puoi viaggiare da qualsiasi valore vero a qualsiasi altro valore vero spostando [sinistra, destra, su, giù] e ignorando solo i valori veri.
EDIT: come da richiesta di Doc
Il numero di elementi può raggiungere facilmente 100 K, in realtà può essere molto più grande, 10 M o anche di più - > questo fa parte del meccanismo di risoluzione dei problemi in cui la dimensione del problema può essere infinita, quindi migliore è l'impl. saranno i problemi più grandi che posso risolvere.
l'array di bit 2D rappresenta un aspetto del problema, quindi anche il più grande è il migliore, per ora è meno di 1000 bit.
il sottoinsieme di controlli ha implementato il meglio che posso pensare (in c ++, con xor e amp; o di byte) ma quando la raccolta diventa grande ci vuole molto tempo per progredire.