我的问题是为基于事件的模拟选择数据结构。
将N个未来事件与其发生时间一起维护。 N是固定的或至少是有界的,范围从10到10000.每个事件都有一个唯一的ID,除了时间之外,它原则上可以被检索。
在循环中,会发生以下情况。 删除并执行下一个事件,并生成随机未来时间的相同类型的新事件以替换它。作为副作用,一些(<10)现有事件改变它们发生的时间并且需要重新安排。这些待重新安排的事件的ID是已知的,但不是它们发生的时间。
我认为堆快速获取最低元素会很好,但我还需要快速重新排序ID访问的任意元素。有BatHeap在O(log N)中查找元素和插入,但似乎不允许索引访问?
我更喜欢持久性结构(部分用于教育目的),但如果只有一个可变结构能够快速运行,我会使用它。
答案 0 :(得分:2)
您的问题和优先级队列需要优先级队列,堆是最好的方法。
如果你想要一个持久堆,你可以在OCaml中实现Leftist heap,用于教育目的。
但是,BatHeap也可以满足您的需求,因为它是功能堆。
好的,我现在知道你想要什么a heap + map
。
由于功能原因,您需要知道OCaml中map
的操作是O(logN)
。您可以使用hashtbl
,但它使用imperative
的数组,而不是持久方式或功能方式。
如果你想要一种纯粹的功能方式,并且可以接受O(logN)
,那么你需要有两个数据结构,一个是堆,另一个是map。
在地图中,键是事件类型id,值是该事件类型的堆。
但我想即使你发明了HeapMap
的东西,你也需要双倍空格,因为两种信息(order of time
和order of index
)都会被维护。
答案 1 :(得分:2)
在第一次近似时,您可以使用堆或地图(堆有O(1)删除优先而不是O(log n),但可能不实现随机删除)配对到将ID映射到时间的Hashtable。映射结构不需要是持久的,因为它可以从时间索引结构中轻松地重建。