Supponiamo di avere una collezione di set si escludono a vicenda
{A, B, C, D} dove A = {1, 2,3}, B = {4,5,6}, C = {7,8,9}, D = {10,11,12}
E dato un valore Z , per esempio di 3, mi aspetto che restituisca l'indice del set A, perché A ha 3 come membro.C++/Java: in modo efficiente trovare un set della collezione contenente dato valore
La domanda è: come potrei farlo in modo efficiente usando C++ o JAVA.
mia soluzione attuale: negozio A, B, C, D come HashSet (o unordered_set in C++) nel contenitore e ciclo attraverso ogni set fino un insieme contenente Z è trovato.
Il problema è che la complessità è O (n) per la quantità di serie memorizzate nel contenitore.
C'è qualche modo (o qualsiasi struttura dati per memorizzare questi set) per farlo più veloce di O (n)?
TBH se i tuoi set sono così semplici, basta usare un array di 'char', richiede meno memoria e un accesso molto veloce. – Olayinka
@Olayinka: è esattamente il contrario. Se i suoi set sono davvero così piccoli, probabilmente non ci saranno differenze significative tra O (n) e O (1), quindi perché introdurre tutti i pericoli e i problemi associati agli array, piuttosto che scegliere la soluzione robusta e semanticamente corretta? E per quanto riguarda il C++, perché array e non 'std :: vector' (o' std :: array' se la dimensione è nota in fase di compilazione)? –
@TruthseekerRangwan: quanto puoi modificare sulla struttura generale del tuo codice? Da dove viene il tuo input? Sei bloccato con la ricezione di una collezione di set? Puoi assumere qualsiasi altra cosa sul contenuto dell'insieme (ad esempio, il valore più piccolo in B è maggiore del più grande in A, o c'è una relazione di ordinamento tra i set)? Ho la sensazione che la tua domanda sia troppo incentrata sulla micro-ottimizzazione. –