如何实现纯功能标准二进制堆(ocaml或haskell)?

时间:2012-01-02 01:30:56

标签: haskell functional-programming ocaml

是否有任何纯功能标准二进制堆的实现?我知道有很多有趣的堆,例如:二项式,左侧堆,它们都有功能实现,只是想知道有没有办法实现标准二进制堆,或者我们必须使用Array来实现它,因为不可变类型?谢谢!

3 个答案:

答案 0 :(得分:10)

您不需要数组来实现堆,您可以将其实现为树结构。

data Heap t = Node t (Heap t) (Heap t) | Nil

缺点是您最终会为每个堆操作重新分配O(log N)个节点,并且您将不会拥有基于阵列的命令式实现的任何缓存局部性。使用这种结构时,某些操作会很困难,但由于我不知道你想用堆做什么,所以我不能指出你更具体的方向。

我们拥有像finger树一样的特殊功能结构的原因是为了加速你通常不会在堆上执行的特定操作,例如检索最左边的叶节点。您可以使用许多相同的数据结构来学习Haskell中的命令式语言,只更改它们的更新方式。

答案 1 :(得分:5)

无耻插件:Braun trees是纯功能小堆(或优先级队列)的理想选择。

答案 2 :(得分:1)

您可以查看本文A Functional Approach to Standard Binary Heaps或此来源Heap.scala中描述的提示。