我需要一个具有以下要求的数据结构:
我倾向于使用ArrayList
。在这种情况下,似乎O(1)
两者都读取元素(它们总是?),删除元素(我只需要在列表的末尾删除它们)并添加(我只添加到结尾)列表)。
只有当ArrayList完全填满并且我需要添加更多元素时,ArrayList会不时地产生性能损失。
还有其他更好的主意吗?我不认为这里的数据结构会超过ArrayList
。
由于
答案 0 :(得分:6)
听起来不错,但在C#中你应该使用List<T>
。它是ArrayList<E>
的Java等价物。 C#中的ArrayList
类不是通用的,基本上被新的List<T>
类淘汰了。
只有当ArrayList完全填满并且我需要向其添加更多元素时,ArrayList会不时地产生性能损失。
这可能不会是一个问题,你可能不应该担心它,除非你有性能分析。但是,如果您事先知道(或可以猜测)列表中包含的元素数量,则可以将其Capacity
设置为该值(Java中为ensureCapacity
)。这将使列表提前保留所需的内存。您还可以在both languages中为列表构造函数提供容量。
答案 1 :(得分:4)
使用ArrayList。
当你正确地说它达到容量限制时,它会动态调整大小。然而,这应该不是问题,因为它使用足够聪明的算法,每个附加操作的平均成本仍然只是O(1)。
答案 2 :(得分:0)
始终使用List<T>
而不是ArrayList
答案 3 :(得分:0)
实际上添加可能更多是O(N),因为当数组超出分配限制时必须重新分配和复制数组。 Javadocs指定它以O(N)的摊销成本增长,无论这意味着什么,正如我所期望的那样O(NlogN),但显然他们拥有比我所知的更智能的算法。
如果你在施工时分配足够的元素来包含完整的集合,那就是O(1)。
请参阅:http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html
答案 4 :(得分:0)
您需要平衡读取访问的相对频率与List<T>
的写入访问权限。必须注意的是,对于大多数用途,您不太可能注意到调整ArrayList<T>
但是,如果您在最后添加和删除一个项目,那么您所说的不仅仅是按索引获取项目(基本上使用列表作为Stack或Queue)和您的profiler告诉您ArrayList<T>
是您的性能瓶颈所在,您应该考虑使用仅用于此类用途的LinkedList<T>
。