一种快速搜索任何类型集合的方法,直到找到一个更大的值(在排序列表中)
本文关键字:一个 列表 排序 方法 一种 搜索 任何 集合 类型 | 更新日期: 2023-09-27 18:07:33
我正在寻找一种方法来快速检索列表中的所有项目。这个列表包含时间值,我需要在特定时间之前的所有内容。显然,一个有序的列表应该很容易,一旦你发现列表中有一个元素的值比你定义的值高,它就会停止。
我在网上找到了这个有序队列,它声称速度很快,但它没有一个好的方法来查找所有时间到某一点。
如果我知道有一种方法可以让这个方法(一个又好又快的方法),我会的,但是我不知道最好的方法是什么。
我目前使用这个队列如下,这不是最好的方式使用它(我认为):
while (mDisposing == false)
{
if (this.mIdleChoresRunning == true)
{
try
{
if ((mIdleChoreQueue.First != null) && (Timing.IsTimeOutByTicksNow(mIdleChoreQueue.First.AddTime, mIdleChoreQueue.First.WaitTime)))
{
//var item = mIdleChoreQueue.Dequeue();
var chore = mIdleChores[mIdleChoreQueue.First.IdleChoreIdentification];
mIdleChoreQueue.First.AddTime = Environment.TickCount;
mIdleChoreQueue.First.WaitTime = chore.IdleMiliSeconds;
mTaskQueue.EnqueueTask(() =>
//Task.Factory.StartNew(() =>
{
chore.Execute(mIdleChoreQueue.First.Context);
});
mIdleChoreQueue.UpdatePriority(mIdleChoreQueue.First, mIdleChoreQueue.First.AddTime + mIdleChoreQueue.First.WaitTime);
}
else
{
Thread.Sleep(10);
}
}
catch (Exception exception)
{
mLogger.Error("ExecuteIdleChores() EXCEPTION", exception);
}
}
else
{
Thread.Sleep(100);
}
}
澄清一下,我并不关心集合的类型,我只想要一种比
更快的方法来获取我的项目(并执行它们):mIdleChoreList.Where(x => Timing.IsTimeOutByTicksNow(x.AddTime, x.WaitTime));
因为。where()操作真的很慢
考虑双链表(c#中的排序列表),您将根据时间值插入项。要处理的项目将是列表中的第一个项目。简化删除项目,如果你需要处理它,处理它,增加时间值,并将新的时间值添加回列表。由于列表已排序,因此项目将被放置在适当的位置。最大的开销将发生在插入上。
下面是c#中关于链表的更多信息https://msdn.microsoft.com/en-us/library/ms132319 (v = vs.110) . aspx如果要将自定义类添加到列表中,可以使用自定义比较器。例如,创建一个带有TimeToExecute和IncrementValue属性的类,并基于TimeToExecute插入。您还可以探索二叉搜索树(c#中的排序字典)。排序字典和排序列表的区别在于,在排序字典中插入更快。但是,跟踪/查找要处理的项目将会变慢。(你可以使用linq的where子句,但是性能不是最快的)。
hashmap具有更快插入的优点,但与排序字典一样,您需要查找要处理的值。
请记住,如果你确切地知道你在寻找什么,即一个特定的时间,字典/哈希映射是最好的。如果你正在寻找一个范围,你仍然需要扫描整个字典。
对于有序列表,查找任何项的最快方法是二分查找(O(log n))。
注意:听起来你需要一个特定点之前的项目列表(它本身是O(n)),理论上任何算法都可以,包括基本的Where(x => ChekcTime(x))
。