Voglio filtrare in modo efficiente un elenco di numeri interi per i duplicati in modo che solo il set risultante debba essere memorizzato.
In un modo questo può essere visto:
- abbiamo un intervallo di numeri interi con grande (diciamo )
- abbiamo una funzione con, presumibilmente, molte collisioni (le immagini sono distribuite uniformemente in )
- dobbiamo quindi memorizzare , ovvero { f ( x ) | x ∈ S }
Ho una stima (probabilistica) abbastanza accurata di cosa è e può quindi allocare in anticipo le strutture di dati (diciamo | f [ S ] | ≈ 2 30 ).
Ho avuto alcune idee, ma non sono sicuro di quale sarebbe l'approccio migliore:
- un bitset è fuori discussione perché il set di input non si adatta alla memoria.
- una tabella hash, ma (1) richiede un sovraccarico di memoria, diciamo il 150% di e (2) la tabella deve essere esplorata quando costruita, il che richiede tempo aggiuntivo a causa del sovraccarico di memoria.
- un ordinamento "al volo", preferibilmente con (ordinamento non comparativo). A tal proposito, non sono sicuro di quale sia la differenza principale tra il bucket bucket e il flashsort .
- un array semplice con un albero di ricerca binario, ma richiede tempo .
- magari usando filtri Bloom o una struttura dati simile potrebbe essere utile in un rilassamento (con falsi positivi) del problema.
Alcune domande su StackOverflow sembrano affrontare questo tipo di cose ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -array-trovando-duplicati ), ma nessuno sembra corrispondere ai miei requisiti.