【问题标题】:Looking for indexable, self-sorting data structure with multiple keys寻找具有多个键的可索引、自排序数据结构
【发布时间】:2015-06-27 04:06:34
【问题描述】:

我想存储成对的<Integer, Object> 并通过整数键将它们按升序排列。但是,应该允许为结构中的不同对象保留相同的键,因此我不能使用标准地图之一。

此外,这些对应该能够通过索引来寻址。因此,如果我想在索引 2(第三大整数值)处寻址该对,它应该返回存储在那里的对象。之后我想更改整数值,再次对结构进行排序并根据升序重新排列索引。

此结构中的对数将保持不变,因此我不需要有效的插入或删除,只需要有效的排序。

Java 中是否有这样的数据结构(或至少一般而言)?

【问题讨论】:

    标签: java sorting data-structures


    【解决方案1】:

    如果您打算对多个条目使用相同的密钥,您应该考虑使用来自 Google Guava 的MultiMap,例如。

    http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Multimap.html

    MultiMap 接口的实现之一是SortedSetMultimap,这在您的情况下非常有用。

    【讨论】:

    • 不,这不是我想要的。应该有如下条目: (index: 0) (index: 1) (index: 2) (index: 3) 等等。
    【解决方案2】:

    这可能有点过于具体,无法在通用库中存在,但可以用来有效解决此问题的数据结构是 order statistic tree(即自平衡二叉搜索树 (BST),其中每个节点存储以该节点为根的子树的大小)。

    从这棵树中插入和删除(我们可以将更新定义为删除后插入)看起来与常规 BST 完全相同,除了适当地增加和减少子树的大小。

    为了获取第 i 个元素,我们从根开始,并通过查看节点数反复确定目标节点在哪个子子树中。

    上述任何操作都需要 O(log n) 时间。

    如果您能够以某种方式(例如使用相应的对象)order 具有相同整数值的元素,则上述内容将按原样工作。如果它们不能被排序,也可以让每个节点是具有相同整数值的元素的集合(例如 List),然后,我们跟踪元素的数量而不是节点的数量(即每个子树中每个节点的大小之和。

    注意:如果您找不到库或自平衡实现,最简单的方法可能是采用红黑树的工作实现并对其进行修改以跟踪大小。


    如果您更喜欢简单:

    如果您对获得第 i 个元素的 O(n) 和每次更新的 O(log n) 感到满意,您可以与我上面描述的类似,只需使用 TreeMap<Integer, List<Object>>(或 @987654323 @),即让每个节点存储具有该整数值的对象列表。然后,要找到第 i 个元素,您可以简单地遍历并跟踪到目前为止我们遇到了多少个元素。

    如果您对获得第 i 个元素的 O(1) 感到满意,但每次更新 O(n),您可以简单地使用已排序的 ArrayList 并遍历以找到正确的元素并将其转移到正确的位置。更新可以优化为使用二分搜索,但仍然是 O(n)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-30
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多