繁体   English   中英

帮助选择正确的数据结构

[英]Help choosing the right data structure

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

  1. 需要能够通过索引获取元素(如List)。
  2. 我将始终只添加/删除结构末尾的元素。

我倾向于使用ArrayList 在这种情况下,似乎是O(1)都读取元素(它们总是?),删除元素(我只需要在列表的末尾删除它们)并添加(我只添加到结尾名单)。

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

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

谢谢

听起来不错,但在C#中你应该使用List<T> 它是ArrayList<E>的Java等价物。 C#中的ArrayList类不是通用的,并且基本上被新的List<T>类废弃了。

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

这可能不会是一个问题,你可能不应该担心它,除非你的性能分析。 但是,如果您事先知道(或可以猜测)列表将包含的元素数量,则可以将其Capacity设置为该值(使用Java中的ensureCapacity )。 这将使列表提前保留所需的内存。 您还可以使用两种 语言为列表构造函数提供容量。

使用ArrayList。

当你正确地说它达到容量限制时,它会动态调整大小。 然而,这应该不是问题,因为它使用足够聪明的算法,即每个附加操作的平均成本仍然只是O(1)。

始终使用List<T>而不是ArrayList

实际上添加可能更多是O(N),因为当数组超过分配限制时必须重新分配和复制数组。 Javadocs指定它以O(N)的摊销成本增长,无论这意味着什么,正如我所期望的那样O(NlogN),但显然他们拥有比我所知的更智能的算法。

如果在施工时分配足够的元素来包含完整的集合,则为O(1)。

请参阅: http//java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html

您需要平衡读取访问的相对频率与对List<T>写入访问权限。 必须注意的是,对于大多数用途,您不太可能注意到调整ArrayList<T>的大小

但是,如果你在最后添加和删除一个项目,那么你所说的比通过索引获取项目更多(基本上使用List作为堆栈队列 ),你的探查器会告诉你ArrayList<T>是你的位置性能瓶颈是,你应该考虑使用LinkedList<T> ,它只是用于这种用法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM