帮助选择正确的数据结构

时间:2010-05-31 16:24:54

标签: c# java data-structures

我需要一个具有以下要求的数据结构:

  1. 需要能够按索引获取元素(如List)。
  2. 我将始终只添加/删除结构末尾的元素。
  3. 我倾向于使用ArrayList。在这种情况下,似乎O(1)两者都读取元素(它们总是?),删除元素(我只需要在列表的末尾删除它们)并添加(我只添加到结尾)列表)。

    只有当ArrayList完全填满并且我需要添加更多元素时,ArrayList会不时地产生性能损失。

    还有其他更好的主意吗?我不认为这里的数据结构会超过ArrayList

    由于

5 个答案:

答案 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>

的大小。

但是,如果您在最后添加和删除一个项目,那么您所说的不仅仅是按索引获取项目(基本上使用列表作为StackQueue)和您的profiler告诉您ArrayList<T>是您的性能瓶颈所在,您应该考虑使用仅用于此类用途的LinkedList<T>