Je veux filtrer efficacement une liste d'entiers pour les doublons d'une manière que seul l'ensemble résultant doit être stocké.
Cela peut être vu d'une manière:
- nous avons une gamme d'entiers avec grand (disons )
- nous avons une fonction avec, supposément, de nombreuses collisions (les images sont uniformément réparties dans )
- il faut alors stocker , c'est-à-dire
J'ai une estimation (probabiliste) assez précise de ce qui est, et peut donc allouer des structures de données à l'avance (disons ).
J'ai eu quelques idées, mais je ne sais pas quelle serait la meilleure approche:
- un jeu de bits est hors de question car l'ensemble d'entrée ne tient pas en mémoire.
- une table de hachage, mais (1) cela nécessite une surcharge de mémoire, disons 150% de et (2) la table doit être explorée lors de sa construction, ce qui nécessite du temps supplémentaire en raison de la surcharge de la mémoire.
- un tri "à la volée", de préférence avec une complexité (tri sans comparaison). À ce sujet, je ne sais pas quelle est la principale différence entre le tri par compartiment et le tri flash .
- un tableau simple avec un arbre de recherche binaire, mais cela nécessite temps.
- peut-être que l'utilisation de filtres Bloom ou d'une structure de données similaire pourrait être utile pour détendre (avec des faux positifs) le problème.
Certaines questions sur stackoverflow semblent s'attaquer à ce genre de choses ( /programming/12240997/sorting-array-in-on-run-time , /programming/3951547/java -array-find-duplicates ), mais aucun ne semble correspondre à mes exigences.