Desejo filtrar com eficiência uma lista de números inteiros para duplicatas, de maneira que apenas o conjunto resultante precise ser armazenado.
Uma maneira de isso ser visto:
- nós temos um intervalo de números inteiros com grande (por exemplo, )
- temos uma função com, supostamente, muitas colisões (as imagens são distribuídas uniformemente em )
- então precisamos armazenar , que é { f ( x ) | x ∈ S }
Eu tenho uma estimativa bastante precisa (probabilística) do que é e, portanto, pode alocar estruturas de dados com antecedência (digamos | f [ S ] | ≈ 2 30 ).
Eu tive algumas idéias, mas não tenho certeza qual seria a melhor abordagem:
- um bitset está fora de questão porque o conjunto de entradas não cabe na memória.
- uma tabela de hash, mas (1) requer alguma sobrecarga de memória, digamos 150% de e (2) a tabela deve ser explorada quando criada, o que requer tempo adicional devido à sobrecarga da memória.
- uma classificação "on the fly", de preferência com complexidade (classificação sem comparação). Com relação a isso, não tenho certeza de qual é a principal diferença entre a classificação de bucket e o flashsort .
- uma matriz simples com uma árvore de pesquisa binária, mas isso requer tempo .
- talvez o uso de filtros Bloom ou uma estrutura de dados semelhante possa ser útil no relaxamento (com falsos positivos) do problema.
Algumas perguntas sobre o stackoverflow parecem abordar esse tipo de coisa ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -array-find-duplicates ), mas nenhum parece corresponder aos meus requisitos.