我有一组时间敏感的项目。经过一段时间后,最后一项需要脱落,并在开头放置一个新项目。
这样做的最佳方式是什么?
答案 0 :(得分:10)
我建议使用队列,只是数组或列表的特殊实例。当您的定时事件发生时,弹出队列中的最后一项,然后按下您的新项目。
答案 1 :(得分:7)
使用数组执行此操作的最简单方法可能是使用循环索引。而不是总是查看array [n],你将引用数组[cIndex](其中cIndex引用被索引的数组中的项目(cIndex基于arraySize(cIndex%arraySize)递增)。
当您选择删除数组中最旧的项时,您只需引用位于((cIndex +(arraySize - 1))%arraySize)的元素。
或者,您可以使用linkedList方法。
答案 2 :(得分:6)
改为使用Queue。
答案 3 :(得分:1)
使用队列,最好是使用链表实现的队列。
答案 4 :(得分:1)
查看using a Queue而不是简单的数组。
答案 5 :(得分:1)
如果有固定数量的项目,队列将起作用。
鉴于'time of time'已知,具有DateTime键的SortedDictionary如何,并覆盖Add方法以删除具有太旧键的所有项目。
答案 6 :(得分:1)
LinkedList<T>具有应该完美运行的AddFirst和RemoveLast成员。
编辑:看看队列文档,似乎他们使用内部数组。只要实现使用循环数组类型算法,性能应该没问题。答案 7 :(得分:0)
在csharp 3中你可以这样做:
original = new[] { newItem }.Concat(
original.Take(original.Count() - 1)).ToArray()
但是你可能最好使用专门的数据结构
答案 8 :(得分:0)
Queue
非常适合FIFO数组。对于通用数组处理,请使用List(T)
例如,Insert(0, x)
和RemoveAt(0)
方法可以放置或删除列表前面的项目。
答案 9 :(得分:0)
从技术上讲,你需要一个双端队列。队列只有一个项目被推送和弹出。双端开放的双性人。
大多数语言都允许数组操作,只需删除第一个元素并将另一个元素放在最后。
或者,您可以通过循环移动每个元素。只需用邻居替换每个元素(从最旧的元素开始)。然后将新项目放在最后一个元素中。
如果你知道你的双端队列不会超过一定的大小,那么你可以把它变成圆形。你需要两个指针来告诉你两端的位置。添加和删除项目会相应地增加/减少指针。你必须检测缓冲区溢出情况(即你的指针'交叉')。而且你将不得不使用模数运算,所以你的指针绕数组循环。
或者您可以为数组中的每个元素添加时间戳,并在它们变得太旧时删除它们。您可以通过以相同的方式保持单独的数组索引,或者通过具有两个元素数组的数组,并将时间戳存储在其中一个子元素中来实现。
答案 10 :(得分:0)
如果你正在寻找最快的方法,那么它将是一个圆形数组:你跟踪你在数组中的当前位置(ndx),以及结束数组(结束),所以当你插入一个项目时,你隐含地删除了最旧的项目。
循环数组是我所知道的固定大小队列的最快实现。
例如,在C / C ++中,它对于整数看起来像这样(当你得到0时退出):
int queue[SIZE];
int ndx=0; // start at the beginning of the array
int end=SIZE-1;
int newitem;
while(1){
cin >> newitem;
if(!newitem) // quit if it's a 0
break;
if(ndx>end) // need to loop around the end of the array
ndx=0;
queue[ndx] = newitem;
ndx++
}
可以进行大量优化,但如果您想自己构建,这是最快的路线。
如果您不关心性能,请使用随附的Queue对象,因为它应该是通用的。
它可能会也可能不会被优化,并且它可能不支持固定大小的列表,因此请务必在使用前查看相关文档。