【发布时间】:2011-12-25 10:25:29
【问题描述】:
我没有接受过正式的 CS 培训,所以请耐心等待。
我需要做一个模拟,可以抽象为以下内容(省略细节):
我们有一个代表事件时间的实数列表。在 每一步,我们
- 删除第一个事件,然后
- 作为“处理”它的结果,一些其他事件可能会在严格的稍后时间插入到列表中
并重复多次。
问题
我可以使用什么数据结构/算法来尽可能高效地实现这一点?我需要显着增加列表中事件/数字的数量。首要任务是尽可能快地处理长列表。
由于我在 C++ 中执行此操作,因此 STL 或 boost 中已有哪些数据结构可以轻松实现?
更多详情:
列表中的事件数量是可变的,但保证在n 和2*n 之间,其中n 是一些模拟参数。在事件时间增加的同时,最新和最早事件的时间差也保证小于常数T。最后,我怀疑时间上的事件密度虽然不是恒定的,但也有一个上限和下限(即所有事件永远不会强烈地聚集在一个时间点周围)
目前的努力:
正如问题的标题所说,我正在考虑使用排序的数字列表。如果我使用链表进行恒定时间插入,那么我很难找到以快速(次线性)方式插入新事件的位置。
现在我正在使用一个近似值,将时间划分为多个桶,并跟踪每个桶中有多少事件。然后随着时间“流逝”一个接一个地处理桶,当从前面移除一个桶时,总是在最后添加一个新桶,从而保持桶的数量不变。这很快,但只是一个近似值。
【问题讨论】:
-
选择数据结构取决于您要在其中存储什么样的数据以及您将对数据结构执行的操作。
-
是否所有事件都有唯一的时间戳,时间格式是什么?
-
@Als 我只花了 20 分钟把所有的东西都写出来了……一切都在问题中
-
@KerrekSB 对于每个事件我需要存储时间戳(双精度或浮点数)和类型(只有几种类型,目前为 2,所以这可以是一个枚举)
-
std::priority_queue将是我的首选。
标签: c++ performance algorithm data-structures simulation