用于在OCaml中频繁重新调度的排队的快速功能数据结构

时间:2014-01-27 13:45:47

标签: data-structures ocaml ocaml-batteries

我的问题是为基于事件的模拟选择数据结构。

将N个未来事件与其发生时间一起维护。 N是固定的或至少是有界的,范围从10到10000.每个事件都有一个唯一的ID,除了时间之外,它原则上可以被检索。

在循环中,会发生以下情况。 删除并执行下一个事件,并生成随机未来时间的相同类型的新事件以替换它。作为副作用,一些(<10)现有事件改变它们发生的时间并且需要重新安排。这些待重新安排的事件的ID是已知的,但不是它们发生的时间。

我认为堆快速获取最低元素会很好,但我还需要快速重新排序ID访问的任意元素。有BatHeap在O(log N)中查找元素和插入,但似乎不允许索引访问?

我更喜欢持久性结构(部分用于教育目的),但如果只有一个可变结构能够快速运行,我会使用它。

2 个答案:

答案 0 :(得分:2)

您的问题和优先级队列需要优先级队列,堆是最好的方法。

如果你想要一个持久堆,你可以在OCaml中实现Leftist heap,用于教育目的。

但是,BatHeap也可以满足您的需求,因为它是功能堆。


好的,我现在知道你想要什么a heap + map

由于功能原因,您需要知道OCaml中map的操作是O(logN)。您可以使用hashtbl,但它使用imperative的数组,而不是持久方式或功能方式。

如果你想要一种纯粹的功能方式,并且可以接受O(logN),那么你需要有两个数据结构,一个是堆,另一个是map。

在地图中,键是事件类型id,值是该事件类型的堆。

但我想即使你发明了HeapMap的东西,你也需要双倍空格,因为两种信息(order of timeorder of index)都会被维护。

答案 1 :(得分:2)

在第一次近似时,您可以使用堆或地图(堆有O(1)删除优先而不是O(log n),但可能不实现随机删除)配对到将ID映射到时间的Hashtable。映射结构不需要是持久的,因为它可以从时间索引结构中轻松地重建。