我正在寻找一种数据结构或各种数据结构的组合,这些结构在随机和顺序访问方面表现非常出色。
我需要将(整数)id映射到(double)值并按该值排序。这些值可以多次出现。
数据量可能很大。
插入或删除并不重要。迭代和获取操作是。
我正在使用Java。目前我有一个Guava Multimap,它是从TreeMap和ArrayList构建的,用于顺序访问。对于随机访问,我并行使用HashMap。
有什么建议吗?
答案 0 :(得分:1)
当插入和删除不重要时,排序的数组可能是你的朋友。您可以通过Arrays.binarySearch
直接在那里搜索并自定义Comparator
。
如果您不知道大小的任何理智上限,您可以切换到ArrayList
(或实现您自己调整大小,但为什么......)。
我想这可能比TreeMap
更快,这在插入和/或删除很重要时很好,但是受到空间局部性不好的影响(二进制树有很多指针要跟随)。
最佳结构会将所有数据放在一个数组中,这在Java中是不可能的(为此你需要C struct
)。您可以通过将double
放入long
来伪造它,这肯定会起作用并且快速(Double.doubleToLongBits
并且返回是内在的,并且两种数据类型的长度都是64位) 。这将意味着一项非常重要的工作量,特别是对于排序(如果这种情况不太常见,那么在某些可排序的数组中进行转换就可以了)。
为了加快搜索速度,您可以使用散列,例如,通过HashMap
指向第一个元素并链接元素。因为你的密钥是int
s,一些具有原始能力的实现会有所帮助(例如,trove或fastutils或其他)。
有无数种可能性,但保持所有数据同步可能很难。