我没有正式的CS培训,所以请耐心等待。
我需要做一个模拟,可以抽象到以下(省略细节):
我们有一个代表事件发生时间的实数列表。在 每一步,我们
- 删除第一个事件,
- 作为“处理”的结果,其他一些事件可能会在严格的时间插入到列表中
醇>并多次重复。
问题
我可以使用哪种数据结构/算法来尽可能高效地实现此目的?我需要显着增加列表中的事件/数字的数量。优先考虑的是尽可能快地列出一长列表。
由于我在C ++中这样做,STL或boost中已经有哪些数据结构可以简化实现这一点?
更多详情:
列表中的事件数量是可变的,但保证在n
和2*n
之间,其中n
是一些模拟参数。当事件时间增加时,最新事件和最早事件的时间差也保证小于常数T
。最后,我怀疑时间事件的密度虽然不是常数,但也有上限和下限(即所有事件永远不会强烈聚集在一个时间点附近)
到目前为止的努力:
正如问题的标题所说,我正在考虑使用排序的数字列表。如果我使用链表进行恒定时间插入,那么我很难找到以快速(次线性)方式插入新事件的位置。
现在我正在使用近似值,我将时间划分为桶,并跟踪每个桶中有多少事件。然后随着时间的推移逐个处理铲斗,当从前面移除一个铲斗时,总是在末端添加一个新铲斗,从而保持铲斗的数量不变。这很快,但只是近似值。
答案 0 :(得分:5)
最小堆可能适合您的需求。有一个explanation here,我认为STL会为您提供priority_queue
。
插入时间为O(log N),删除为O(log N)
答案 1 :(得分:4)
听起来你需要/想要一个优先级队列。如果内存服务,则编写标准库中的优先级队列适配器以检索最大的项而不是最小的项,因此您必须指定它使用std::greater
进行比较。
除此之外,它提供了您所要求的确切内容:快速访问/删除最小/最大项目的能力,以及快速插入新项目的能力。虽然它没有按顺序维护所有项目,但它确实保持了足够的顺序,它仍然可以快速找到/删除一个最小(或最大)的项目。
答案 2 :(得分:2)
我会从一个基本的优先级队列开始,看看它是否足够快。 如果没有,那么你可以看一下自定义的东西。
答案 3 :(得分:1)
二叉树总是排序,访问时间比线性列表快。搜索,插入和删除时间为O(log(n))。
但这取决于项目是否必须始终排序,或者仅在过程完成后排序。在后一种情况下,哈希表可能更快。然后,在该过程结束时,您可以将项目复制到数组或列表中并对其进行排序。