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

标签 java performance data-structures asymptotic-complexity

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

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

数据量可能很大。

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

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

有什么建议吗?

最佳答案

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

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

我猜这可能比 TreeMap 更快,这在插入和/或删除很重要时很好,但空间局部性不好(有许多指针要遵循的二叉树)。

最佳结构会将所有数据放在一个数组中,这在 Java 中是不可能的(为此您需要 C struct)。您可以通过将 double 放入 long 来伪造它,这肯定会工作并且速度很快(Double.doubleToLongBits 和后面是内在函数,并且两种数据类型的长度都是 64 位)。这将意味着大量的工作,尤其是排序(如果这种情况不常见,则可以在某些可排序数组中进行转换并返回)。

为了获得更快的搜索,您可以使用哈希,例如,通过指向第一个元素并链接元素的 HashMap。由于您的 key 是 int,因此一些具有原始能力的实现会有所帮助(例如 trove 或 fastutils 或其他)。

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

关于java - 用于随机和顺序访问的快速数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19905389/

相关文章:

c# - 改进具有双重属性的数据结构

java - GAE - 使用枚举字段和 'contains' 运算符过滤数据时 JDO 查询失败

.net - IronRuby ScriptSource.Execute 线程安全吗?

javascript - 移动 DOM 节点和浏览器重绘性能

android - 滚动基于 Cursor 的适配器的大列表比内存中适配器的小列表快得多

c++ - 使用 vector 对堆栈进行排序

c - 对 struct c 数组中的 struct 数组进行排序

java - 堆栈使用Processing(基于JAVA)

java - Restful : How to dynamically extend path via interface

java - Jquery 自动完成问题