Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 寻找具有多个键的可索引、自排序数据结构_Java_Sorting_Data Structures - Fatal编程技术网

Java 寻找具有多个键的可索引、自排序数据结构

Java 寻找具有多个键的可索引、自排序数据结构,java,sorting,data-structures,Java,Sorting,Data Structures,我想存储成对的,并按整数键按升序排列。但是,应该允许为结构中的不同对象保留相同的键,因此我不能使用标准贴图之一 此外,这些对应该能够通过索引进行寻址。因此,如果我想在索引2(第三大整数值)处寻址该对,它应该返回存储在那里的对象。之后,我想更改整数值,再次对结构进行排序,并按照升序重新排列索引 这个结构中的对数是恒定的,所以我不需要有效的插入或删除,只需要有效的排序 java中有这样的数据结构(或者至少在一般情况下)?< p>如果你要使用同一个键来处理多个条目,你应该考虑使用番石榴> Mult

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

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

这个结构中的对数是恒定的,所以我不需要有效的插入或删除,只需要有效的排序


java中有这样的数据结构(或者至少在一般情况下)?

< p>如果你要使用同一个键来处理多个条目,你应该考虑使用<谷歌>番石榴> <代码> MultIAPP<代码>。


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

这可能有点过于具体,无法存在于通用库中,但可用于有效解决此问题的数据结构是一个(即自平衡二进制搜索树(BST))其中每个节点存储在该节点上的子树的大小)

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

为了得到第i个元素,我们从根开始,通过查看节点的数量,反复确定目标节点将位于哪个子树中

上述任何操作都需要O(logn)时间

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

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


如果您更喜欢简洁:

如果您对O(n)获取第i个元素和每次更新O(logn)感到满意,那么您可以像我上面描述的那样,只使用
TreeMap
(or),即让每个节点存储具有该整数值的对象列表。然后,为了找到第i个元素,您可以简单地遍历并跟踪到目前为止我们遇到了多少个元素


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

不,这不是我想要的。应该有如下条目:(索引:0)(索引:1)(索引:2)(索引:3)等等。