Quiero filtrar eficientemente una lista de enteros para duplicados de una manera que solo el conjunto resultante necesite ser almacenado.
Una forma de ver esto:
- tenemos un rango de enteros con N grande (digamos 2 40 )
- tenemos una función con, supuestamente, muchas colisiones (las imágenes se distribuyen uniformemente en S )
- entonces necesitamos almacenar , es decir { f ( x ) | x ∈ S }
Tengo una estimación bastante precisa (probabilística) de lo que es, y por lo tanto puede asignar estructuras de datos de antemano (digamos | f [ S ] | ≈ 2 30 ).
He tenido algunas ideas, pero no estoy seguro de cuál sería el mejor enfoque:
- un conjunto de bits está fuera de discusión porque el conjunto de entrada no cabe en la memoria.
- una tabla hash, pero (1) requiere algo de sobrecarga de memoria, digamos 150% de y (2) la tabla debe explorarse cuando se construye, lo que requiere tiempo adicional debido a la sobrecarga de memoria.
- una clasificación "sobre la marcha", preferiblemente con complejidad (clasificación no comparativa). Con respecto a eso, no estoy seguro de cuál es la principal diferencia entre la clasificación de cubetas y la clasificación rápida .
- una matriz simple con un árbol de búsqueda binario, pero esto requiere tiempo .
- quizás usar filtros Bloom o una estructura de datos similar podría ser útil para relajar (con falsos positivos) el problema.
Algunas preguntas sobre stackoverflow parecen abordar este tipo de cosas ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -array-find-duplicates ), pero ninguno parece coincidir con mis requisitos.