我有一个使用ArrayList<T>
的程序,而且T类型也实现了Comparable<T>
。我需要对该列表进行排序。
现在,当我插入新项目时,我将其添加到ArrayList
,然后调用Collections.sort(myArrayList)
。
每次插入新项目时都会使用Collections.sort
进行排序严重影响运行时复杂度?
是否有更适合的数据结构我可以用来始终对列表进行排序?我知道一个名为PriorityQueue
的结构,但我还需要能够通过索引获取列表的元素。
编辑:
在我的特定情况下,插入一个新项目的速度远远低于已经存在的项目,所以最终一个好的建议也可以是ArrayList
,因为它获得了一个项目的时间复杂性。但如果你知道其他任何事情......
答案 0 :(得分:3)
List是一个有序集合,这意味着您需要能够使用索引进行访问。如果集合在内部对元素进行混洗或排序,则插入顺序将不同于内部数据结构中元素的顺序。所以你不能再依赖基于索引的访问了。因此,Sun没有提供SortedList或TreeList类。这就是你使用Collections.sort(..)
的原因Apache commons-collections确实提供了一个TreeList类,但它不是一个排序的List并且被调用,因为它使用树数据结构在内部存储元素。请在此处查看其文档 - http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList.html
答案 1 :(得分:3)
似乎Collection.Sort
实际上就是这里的方式,因为当集合已经几乎排序时,在最坏的情况下排序将不会超过O(n)。
答案 2 :(得分:1)
不是在每次插入后使用Collections.sort(myArrayList)
,您可能想要做一些更智能的事情,因为您知道每次插入元素时您的集合已经被订购。
Collections.sort(myArrayList)
需要0(nlogn)时间,您可以使用Collections.binarySearch
在O(n)时间内在有序集合中执行有序插入。如果按升序排序集合Collections.binarySearch
,则返回您要查找的元素的索引(如果存在)或(-(insertion point) - 1)
。在插入元素之前,您可以使用Collections.binarySearch
(O(logn)时间)查找它。完成您可以派生插入新元素的索引。然后,您可以在O(n)时间内使用addAt
添加元素。整个插入复杂性受addAt
的限制,因此您可以在O(n)时间内在ArrayList中执行有序插入。
答案 3 :(得分:-1)