4

在我的程序中,我有一堆不断增长的数组,其中一个新元素一个接一个地增长到数组的末尾。我发现列表是我程序关键部分的速度瓶颈,因为与数组相比,它们的访问时间很慢 - 切换到数组将性能极大地提高到可接受的水平。因此,为了增加数组,我使用了 Array.Resize。这很好用,因为我的实现将数组大小限制为大约 20 个元素,因此 Array.Resize 的 O(N) 性能是有限的。

但是,如果有一种方法可以在最后将数组增加一个元素而不必使用 Array.Resize 会更好;我相信它会将旧数组复制到新大小的数组中。

所以我的问题是,是否有一种更有效的方法可以在不使用 List 或 Array.Resize 的情况下将一个元素添加到数组的末尾?

4

7 回答 7

10

AList像数组一样具有恒定的时间访问。对于“不断增长的数组”,您确实应该使用List.

当您知道您可能正在向数组支持的结构中添加元素时,您不想一次添加一个新大小。通常最好在数组填满时通过将其大小加倍来增长数组。

于 2010-02-16T10:24:39.977 回答
3

如前所述,List<T>这是您正在寻找的。如果您知道列表的初始大小,则可以为构造函数提供初始容量,这将提高初始分配的性能:

List<int> values = new List<int>(5);

values.Add(1);
values.Add(2);
values.Add(3);
values.Add(4);
values.Add(5);
于 2010-02-16T10:35:56.733 回答
1

List 分配 4 个元素开始(除非您在构造它时指定容量),然后每 4 个元素增长一次。

你为什么不尝试用 Array 做类似的事情呢?即将其创建为具有 4 个元素,然后当您插入第五个元素时,首先将数组增加另外 4 个元素。

于 2010-02-16T10:26:03.050 回答
1

没有办法调整数组的大小,因此获得更大数组的唯一方法是使用Array.Resize创建一个新数组。

为什么不创建数组以从一开始就有 20 个元素(或您最多需要的任何容量),并使用变量来跟踪数组中使用了多少元素?这样您就不必调整任何数组的大小。

于 2010-02-16T10:36:00.373 回答
0

扩大数组 AFAIK 意味着分配了一个新数组,将现有内容复制到新实例。我怀疑这应该比使用List...更快?

于 2010-02-16T10:28:28.160 回答
0

以块(如 10)调整数组的大小并将其存储为单独的变量(例如容量)要快得多,然后仅在达到容量时才调整数组的大小。这就是列表的工作方式,但如果您更喜欢使用数组,那么您应该考虑在更大的块中调整它们的大小,特别是如果您有大量 Array.Resize 调用

于 2010-02-16T10:32:38.613 回答
0

我认为每个想要使用数组的方法都不会被优化,因为数组是一个静态结构,所以我认为最好使用动态结构,如 List 或其他。

于 2010-02-16T10:38:17.933 回答