左移数组或使用添加/删除列表

本文关键字:删除 删除列 列表 添加 数组 左移 | 更新日期: 2023-09-27 18:02:59

我有一个浮点数列表:

List<float> myList = new List<float>(100);

列表的工作方式类似于左移数组,其中列表中的第一个对象被删除,新对象被添加到列表的末尾。像这样:

myList.RemoveAt(0);
myList.Add(sampleFromCollection);

我想知道是否使用数组(有一个左移方法)而不是列表会更快?

左移数组或使用添加/删除列表

您应该使用Queue而不是List。使用Enqueue方法添加到列表中,使用Dequeue方法从前面弹出一个。例如:

Queue<string> numbers = new Queue<string>();
numbers.Enqueue("one");
numbers.Enqueue("two");
numbers.Enqueue("three");
numbers.Enqueue("four");
numbers.Enqueue("five");
while(numbers.Count > 0)
{
    string value = numbers.Dequeue();
    //Do something with the value
}

您知道List的底层表示是一个数组,对吧?它不一定是这样的,但它是为了使随机访问的时间是恒定的,并且添加的成本是通过在块中增加数组来平摊的。

这意味着从"头部"中删除数据的成本与从数组中删除数据的成本完全相同,因为需要完成的工作量相同。

删除后添加将是一个常量时间,因为它保证将有空间为您添加的项。

如果你确实需要在任意一端快速移除和在任意一端快速添加,但可以不使用常数时间随机访问,你可能需要使用deque。如果你要从前面删除并添加到后面,请使用Queue,该Queue将为删除或添加的常量时间。