【问题标题】:Sorting 1,000,000 Objects (not by Key) - Java对 1,000,000 个对象进行排序(不是按键)-Java
【发布时间】:2013-03-02 10:04:24
【问题描述】:

我有大约 1,000,000 个对象需要以某种形式的数据结构存储。它们必须通过键 (ID) 是唯一的 - 但根据它们的日期排序。因此,我试图想出一种将它们存储在某种形式的数据结构中的最佳方法。 性能(就执行时间而言)它是主要目标,然后是内存使用。我的想法是将对象放入树中,以便在它们进入数据结构时根据它们的日期对它们进行排序,然后我可以按顺序返回它们。但是 - 我认为根据其 ID 查找单个对象将非常缓慢。我确实想到的一个想法是有一个二级结构,它将 ID 链接到日期,这样我就可以减少查找单个对象所花费的时间,或者无论如何都按这个 ID 存储所有内容(可能在 HashTable 中),然后进行排序所有 1,000,000 个对象,当我想归还它们时(尽管这似乎需要很长时间)。

要点:

之后可能会添加对象,因此 c.1,000,000 个对象不是固定的。它们不会被更新或删除。 我可能不会使用 Java 的内置比较器。 我正在优化返回数据的效率 - 无论是按顺序(按日期)的完整集合,还是从其 ID 获得的单个对象。

【问题讨论】:

  • 您是否尝试过Comparator 来完成您的任务...?
  • 您能列出您正在优化的用例吗?它们可能会影响数据结构的选择

标签: java sorting data-structures abstract-data-type


【解决方案1】:

如果您主要关心的是内存使用之前的性能,我会选择 2 个数据结构:

ArrayList<YourClass> instancesByDate;

HashMap<SomeId,YourClass> instancesById;

这为您提供了最快的按日期遍历和 O(1) 查找(显然取决于 hashCode())。

【讨论】:

  • 我会选择 SortedSet,并在构造时传入自定义 Comperator&lt;T&gt;。这样您就不需要手动实现“在正确位置插入”。
  • @MartinThurau - 好点。 OP 没有指定他是事先获取所有数据还是需要快速更新。也可以扩展 LinkedHashMap 并在单个结构中通过 ID 和时间迭代获得 O(1) 查找,但这会很复杂。
  • 抱歉 - 我现在将更新问题以解释更多内容。 @MartinThurau
  • 好的,通过阅读更新后的问题,我的答案仍然有效 - “我正在优化返回数据的效率 - 无论是按顺序(按日期)的完整集合,还是从它的 ID”意味着一个昂贵的插入操作是可以的(并且对 arraylist 的迭代比 set/tree 迭代更快)。关于“按 habd”实现插入的 abd - Collections.binarySearch 的返回值将为您提供要插入的索引,所以这里没有什么要实现的。
【解决方案2】:

如何使用 ID 的哈希表 => yourobject 进行 ID 查找,以及日期的辅助哈希表(在某种粒度级别)=> Vector&lt;yourobject&gt;?您可以选择日期的“粒度”以确保每个向量中的对象数量适中 - 并按日期对每个对象进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 2010-11-11
    • 2011-12-23
    • 2017-09-22
    • 2015-12-13
    • 2018-07-16
    • 2021-06-06
    • 2021-07-20
    相关资源
    最近更新 更多