我有一个列表,我想在开头添加多个元素。添加到开始是线性时间,因为它由数组支持并且必须一次移动一个,并且如果我以天真的方式实现这一点,我无法承担这么多次。
如果我确切地知道我要添加多少元素,我可以将它们移动那么多,以便线性只需要发生一次吗?
List<int> myList = new List<int> { 6, 7, 8, 9, 10 };
//Desired list: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
//Unacceptable
for (int i = 5; i>=0; i--){
myList.Insert(0,i);
}
//Is this concept possible?
int newElements = 5;
for (int i = myList.Count; i>=0; i--){
myList[i+newElements] = myList[i];//This line is illegal, Index was out of range
}
for (int i = 0; i< newElements; i++){
myList[i] = i+1;
}
在此特定实例中,访问需要是恒定时间,因此使用List
。我需要能够尽快向数据结构的开头和结尾添加元素。我对O(m)没问题,其中m是要添加的元素数量(因为我不认为可以避免)但是O(m * n)其中n是现有结构中元素的数量是太慢了。
答案 0 :(得分:6)
如果插入的集合实现了InsertRange
,您可以使用ICollection<T>
这是线性的:
var newElements = new[] { 0, 1, 2, 3, 4 };
myList.InsertRange(0, newElements);
答案 1 :(得分:1)
myList.InsertRange(0, new List<int> { 1, 2, 3, 4, 5 });
答案 2 :(得分:1)
如果您的新元素已在List
中,则可以使用List.AddRange
将“旧”列表添加到待添加项目列表的末尾。
答案 3 :(得分:0)
我认为myList.InsertRange(0, newElements)
很适合你。微软将尽可能提高效率。