Java 添加一个元素以根据其成本自动更正位置,从而获得最高性能

Java 添加一个元素以根据其成本自动更正位置,从而获得最高性能,java,performance,collections,set,comparator,Java,Performance,Collections,Set,Comparator,我以前有个问题: 现在我想这样做: 我将定义一个列表,当我添加en元素时,它将根据其成本找到正确的位置。(我不想生成一个包含无序元素的列表,然后对其进行排序) 我想用最出色的表现做到这一点。我的意思是,我的列表每次都会被排序,所以当我想在列表中添加一个元素时,它将是一个添加到排序列表中的过程。有序列表的成本可能是O(logn),通过二进制搜索找到正确的位置(即使找到位置的成本可能较低,向该列表添加元素(即ArrayList)所需的成本可能大于其好处,因此如果您认为使用该类(ArrayList等)

我以前有个问题:

现在我想这样做:

我将定义一个列表,当我添加en元素时,它将根据其成本找到正确的位置。(我不想生成一个包含无序元素的列表,然后对其进行排序)

我想用最出色的表现做到这一点。我的意思是,我的列表每次都会被排序,所以当我想在列表中添加一个元素时,它将是一个添加到排序列表中的过程。有序列表的成本可能是O(logn),通过二进制搜索找到正确的位置(即使找到位置的成本可能较低,向该列表添加元素(即ArrayList)所需的成本可能大于其好处,因此如果您认为使用该类(ArrayList等),可以建议在不使用二进制搜索实现的情况下添加元素不擅长总计)

您可以使用TreeSet(先插入O(日志n)并删除O(1)或PriorityQueue(先插入O(1)并删除O(日志n))

注意:树集是在插入时排序的,而优先级队列不是


避免O(logn)操作的唯一方法是对可能值的范围进行一些严格的假设,这在这里不太可能有帮助。

我想处理一个基于索引的类,我的意思是我想通过get(index)检索一个元素,根据这种需要,你有什么建议?只有在元素不变的情况下,IMHO索引才有意义。i、 e.get(5)应始终返回相同的元素。我想你应该使用一种在添加元素时不会移动的查找方法,但很难说你为什么想要一个低阶索引/排序的集合。实际上我想在我的遗传算法中实现这一点来保存基因。我会在每一代给我的基因列表添加新的基因,我也会从我的基因列表中删除一些最糟糕的基因。然而,我想在我的基因列表上进行突变,这意味着我必须随机选择一个基因,并且应该知道它的索引是什么(它的索引在这一代人结束时可能会改变,这无关紧要)@Peter Lawrey,你可能是wright,关于索引,如何从树集合中随机选择一个元素?在这种情况下,ArrayList是唯一能为您提供高效随机访问的列表。如果这是一个要求,你必须使用它。对于insert,您可以按照建议进行二进制搜索。对于所有的访问类型,都没有O(1)集合(否则您不需要多个;)