Compressé SortedSet mise en œuvre
-
26-10-2019 - |
Question
J'ai besoin de stocker un grand nombre de valeurs de Long
dans une mise en œuvre de SortedSet
de manière efficace l'espace. Je considérais les implémentations bits ensemble et découvert Javaewah . Cependant, l'API des valeurs int
attend plutôt que long
s.
Quelqu'un peut-il recommander des solutions de rechange ou suggérer une bonne façon de résoudre ce problème? Je me préoccupe surtout de l'efficacité de l'espace. Lors de la construction de l'ensemble je besoin d'accéder à l'élément minimum et maximum une fois. Cependant, le temps d'accès est une grande préoccupation (à savoir si une mise en œuvre codée entièrement à longueur sera bien).
EDIT
Je devrait être clair que la mise en œuvre n'a pas à mettre en œuvre la SortedSet
interface fournissant je peux accéder aux éléments minimum et maximum de la collection.
La solution
Vous pouvez utiliser TLongArrayList qui utilise un sous de long[]
. Il prend en charge sort()
de sorte que le minimum et maximum sera la première et la dernière valeur.
Ou vous pouvez utiliser un long[]
avec une longueur et faire vous-même. ;)
utilisera environ 64 octets de plus que les valeurs brutes elles-mêmes. Vous pouvez obtenir plus compact si vous pouvez faire des hypothèses sur la plage de valeurs longues. par exemple. si elles sont effectivement limités à 48 bits.
Vous pouvez envisager d'utiliser LongBuffer. Si elle est la mémoire mappée il évite d'utiliser tas ou direct à la mémoire, mais vous auriez mettre en œuvre une routine de tri vous-même.
S'ils sont regroupés, vous pourriez être en mesure de représenter les données comme un ensemble de gammes. Les gammes peuvent être un pur A - B, ou un BitSet avec une valeur de départ. Les travaux plus tard bien pour les numéros de téléphone. ;)
Autres conseils
Je ne sais pas si elle a réglé ou comment il est efficace par rapport à JCF régulière, mais jetez un oeil à ceci: