我今天的输入大约是450,未来可能会增加。 (有时它运行时少于450,可能是100或20)
对我来说更好:
使用n作为增加的数量(不是实际的复杂性) 我认为将它设置为低于预期n = 440或者某些东西会给我“复杂性”n + 2n =(3n)
然而,如果我把它略高于(n = 460)将只给出
如果我设置n = 800给我一个高n(差不多2n)(高但我用TrimToSize让它更好?
什么是最佳选择?
答案 0 :(得分:6)
我会说实话,我对所有关于n的讨论都进行了掩饰,因为我认为它会降低真实点,即相对效率。
“最佳选择”是使用System.Collections.Generic.List<T>
,将其初始化为合理的内容然后不要担心,直到分析告诉您这是一个问题。
使用通用列表可以为您提供强大的打字支持,并且使用值类型可以避免装箱问题。
如果列表大小不断变化,或者列表不能存活很长时间,修剪它将不会提供太多改进(如果有的话)。如果您了解所涉及的大小的某些内容,则可以使用具有初始容量的重载构造函数来保存一些重新分配:
var list = new List<int>(450);
在初始容量被命中后,列表将继续使用它自己的内部逻辑调整大小以决定要抓取多少(默认情况下,如果你没有指定大小是要加倍大小:从4开始,然后8,16,32等。
答案 1 :(得分:3)
使用这些数字(<1000),这无关紧要。
没有初始容量,您将增加8,16,32,64等log(n)重新分配。
因此,只需使用有点靠近目标的任何值。这里有400和800一样好。您可能会重新分配一次,并且几乎 N
的空间过冲是不可避免的。
答案 2 :(得分:1)
ArrayList适用于.net 1.1
你可以使用List<T>
是一个通用类。
它支持存储特定类型的值,而无需装箱和从对象中取消装箱。 ArrayList只存储对象引用。
答案 3 :(得分:0)
您是否有理由不能使用通用列表?这将扩展/收缩到您需要存储的元素数量。如果你必须使用一个数组,那么我会将它设置为你可以预期的最大值的两倍(即800),因为这是一个相对较小的数字。对于数字,这将是分配的一小部分内存。