我binary heap
在 OCaml 中实现了一个使用列表,只是为了提高我的 OCaml 技能。
使用list感觉很吃力,苦苦挣扎了2天,不得不来这里寻求建议和提示。
到目前为止,这是我的想法
显然,我不能使用原始array based
算法使用 list 来实现它。
我试图利用的是binary tree
. 我一直invariant
认为一个节点应该大于任何级别低于其的节点。
我大致想出了如何实现insert
,虽然我不确定它是否正确。
对于二叉树,每个节点都有two children
,value
而它size n
的总数是offsprings
。这n
用于平衡树。
插入时x
,我与一个节点(从根,递归)进行比较。假设x < the value of the node
,那么
如果节点的一个或两个子节点是Leaf
,那么我将 插入x
到那个 Leaf 位置。
如果none
节点的孩子是叶子,那么我会选择n小于的孩子然后recursively insert
。
这是我的代码
type 'a heap =
| Node of 'a * 'a heap * 'a heap * int
| Leaf
exception EmptyHeapException
let create_heap () = Leaf;;
let rec insert x = function
| Leaf -> Node (x, Leaf, Leaf, 0)
| Node (v, l, r, n) ->
let (stay, move) = if x > v then (x, v) else (v, x)
in
match (l, r) with
| (Leaf, Leaf) ->
Node (stay, Node (move, Leaf, Leaf, 0), Leaf, 1)
| (Leaf, _) ->
Node (stay, Node (move, Leaf, Leaf, 0), r, n+1)
| (_, Leaf) ->
Node (stay, l, Node (move, Leaf, Leaf, 0), n+1)
| (Node (_, _, _, n1), Node (_, _, _, n2)) ->
if n1 <= n2 then
Node (stay, (insert move l), r, n1+1)
else
Node (stay, l, (insert move r), n2+1);;
好的,我有以下问题。
- 我是否朝着正确的方向前进?我的想法或实施是否正确?
- 我陷入了实现
get_top
功能。我不知道如何继续。任何提示? - ocaml 电池实现了一个高效的batHeap.ml。我看过,但我觉得它的方式与我的完全不同,我无法理解。任何人都可以帮助我理解它吗?