一种快速搜索任何类型集合的方法,直到找到一个更大的值(在排序列表中)

本文关键字:一个 列表 排序 方法 一种 搜索 任何 集合 类型 | 更新日期: 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))