Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 允许重复和随机访问元素的SortedList_Java_Algorithm_Sorting_Sortedlist - Fatal编程技术网

Java 允许重复和随机访问元素的SortedList

Java 允许重复和随机访问元素的SortedList,java,algorithm,sorting,sortedlist,Java,Algorithm,Sorting,Sortedlist,我正在开发一种算法,它严重依赖于某些列表中元素的顺序,但是,该列表需要允许重复和随机访问其元素(无需使用迭代器)。我在java中搜索过这样的东西,但找到的选项总是缺少我提到的条件之一 有谁能给我推荐一个java解决方案来解决这个问题,它的时间复杂度是低的还是中等的 如果我扩展了ArrayList的类并重写了add方法,并且在addition之后的方法中调用collection.sort(),那么在时间复杂度方面会更好吗 我认为添加一个元素需要一个固定的时间,因为它直接添加到列表的末尾,排序方法需

我正在开发一种算法,它严重依赖于某些列表中元素的顺序,但是,该列表需要允许重复和随机访问其元素(无需使用迭代器)。我在java中搜索过这样的东西,但找到的选项总是缺少我提到的条件之一

有谁能给我推荐一个java解决方案来解决这个问题,它的时间复杂度是低的还是中等的

如果我扩展了ArrayList的类并重写了add方法,并且在addition之后的方法中调用collection.sort(),那么在时间复杂度方面会更好吗

我认为添加一个元素需要一个固定的时间,因为它直接添加到列表的末尾,排序方法需要n logn,所以在这种情况下,插入需要n logn时间吗

感谢您的帮助


谢谢。

你可以试试谷歌番石榴图书馆的树形拼图。它没有索引的随机访问器,但您可以通过指定范围边界来访问子列表


您可以使用树形图,该树形图按排序顺序存储键,并且该键出现的次数可以存储为值。 现在,您可以迭代映射并填充ArrayList(在键的值大于0的地方填充重复项) 总体复杂性为nlogn 空间复杂度对数n

如果扩展ArrayList并找到插入点/或调用集合.sort(),则在最佳情况下,您的算法是O(n^2*logn)。
如果列表的初始容量不足以容纳所有插入,它将调整大小(额外的O(n)操作)

您可能还需要查看的可能的副本。这是一个更一般的用途,但也可能对你有用。谢谢你提供这个链接,但我需要一个算法来实现,如果你能给我任何提示或建议,这将是一个很大的帮助。谢谢你需要一个“树集合”。TreeSet将为您工作,但副本问题除外。您可以尝试使用自己的容器包装TreeSet,这样它就可以将这对(E,count)存储为TreeSet的每个元素。当您尝试添加重复项时,您将递增计数器。当你移除时,减小计数器直到它为0,在这种情况下你真的移除了它。TreeMultiset不允许随机访问伟大的答案,谢谢。是否可以根据值而不是键对树进行排序?是的,您可以实现键类的comparator/或compareTo以使用值进行比较。这需要在地图中进行额外的查找。我将通过Guava检查此选项,谢谢您的有用回答