【问题标题】:Timestamp based sorted data structure with logarithmic read complexity具有对数读取复杂度的基于时间戳的排序数据结构
【发布时间】:2017-12-07 13:10:45
【问题描述】:

我在 java 中寻找一个好的排序数据结构。在做了一些研究之后,得到了一些关于使用 TreeSet/TreeMap 的提示。但是这些组件缺少一件事:随机访问集合中的一个元素。例如,我想访问排序集中的第 n 个元素,但使用 TreeSet,我必须遍历其他 n-1 个元素才能到达那里。这将是一种浪费,因为我的 Set 中有多达数千个元素。

用例如下所示

9:20 AM what is this object? edited by user1
9:30 AM what is this book ? edited by user2
9:40 PM what is this red book? edited by user1

我总是想显示该用户最新编辑的标题。我知道最新的将是最大的时间戳。为此,我发现ConcurrentSkipListSet/Maps 很好。但是,我想知道是否有更好的方法来实现此功能。

【问题讨论】:

  • 在平衡树中,您只需要遍历日志 N 个条目,而不是 N-1 个条目。
  • 为什么不只记住变量中的最新元素?为什么需要收藏?
  • 我不明白。 TreeSet 和 TreeMap 是专门为通过 get() 方法随机访问元素而构建的。
  • @kan 原因是如果用户撤销编辑我想获得编辑字符串的先前版本。
  • 要从 TreeSet 中选择前一个元素,您不应该通过索引获取元素,而是使用 NavigableSet 方法查找之前的元素。

标签: java sorting collections


【解决方案1】:

假设您应该对数据进行排序,那么您最好的选择是TreeMap。没有灵丹妙药,它是一个排序集合并且还执行O(1) 随机访问。在有序集合中,您可以使用索引直接访问元素,但如果您的集合需要排序,则无法从基于索引的访问中受益。

如果你需要并发,ConcurrentSkipListMap 很好。适用于数据的大规模并发访问。但是,就性能而言,它无法与我们基于红黑树的朋友TreeMap 匹敌。因此,如果您不需要并发,忘记ConcurrentSkipListMap 并坚持使用TreeMap

TreeMap 优雅并满足您的需求。尽管如此,在实践中,使用HashMap 并在需要时对数据进行排序可能会更好。两者都试一下,看看哪一个更适合你的情况。

【讨论】:

    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 2013-03-14
    • 2021-02-11
    • 2020-06-24
    相关资源
    最近更新 更多