用于随机和顺序访问的快速数据结构

时间:2013-11-11 11:37:09

标签: java performance data-structures asymptotic-complexity

我正在寻找一种数据结构或各种数据结构的组合,这些结构在随机顺序访问方面表现非常出色。

我需要将(整数)id映射到(double)值并按该值排序。这些值可以多次出现。

数据量可能很大。

插入或删除并不重要。迭代和获取操作是。

我正在使用Java。目前我有一个Guava Multimap,它是从TreeMap和ArrayList构建的,用于顺序访问。对于随机访问,我并行使用HashMap。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

当插入和删除不重要时,排序的数组可能是你的朋友。您可以通过Arrays.binarySearch直接在那里搜索并自定义Comparator

如果您不知道大小的任何理智上限,您可以切换到ArrayList(或实现您自己调整大小,但为什么......)。

我想这可能比TreeMap更快,这在插入和/或删除很重要时很好,但是受到空间局部性不好的影响(二进制树有很多指针要跟随)。

最佳结构会将所有数据放在一个数组中,这在Java中是不可能的(为此你需要C struct)。您可以通过将double放入long来伪造它,这肯定会起作用并且快速(Double.doubleToLongBits并且返回是内在的,并且两种数据类型的长度都是64位) 。这将意味着一项非常重要的工作量,特别是对于排序(如果这种情况不太常见,那么在某些可排序的数组中进行转换就可以了)。

为了加快搜索速度,您可以使用散列,例如,通过HashMap指向第一个元素并链接元素。因为你的密钥是int s,一些具有原始能力的实现会有所帮助(例如,trove或fastutils或其他)。

有无数种可能性,但保持所有数据同步可能很难。