open Okasaki
open OrderedSig
open HeapSig
module BinomialHeap (Element : Ordered) : Heap =
struct
module Element = Element
type tree = Node of int * Element.t * tree list
type heap = tree list
let empty : heap = []
let is_empty : heap -> bool = function
| [] -> true
| _ -> false
let rank (Node(r,x,c)) = r
let root (Node(r,x,c)) = x
let link (Node (r,x1,c1) as t1) (Node (_,x2,c2) as t2) =
if Element.leq x1 x2
then Node (r+1, x1, t2::c1)
else Node (r+1, x2, t1::c2)
let rec ins_tree t = function
| [] -> [t]
| t'::ts' as ts ->
if rank t < rank t'
then t::ts
else ins_tree (link t t') ts'
let insert x ts =
ins_tree (Node (0, x, [])) ts
let rec merge ts1 ts2 =
match ts1, ts2 with
| _, [] -> ts1
| [], _ -> ts2
| t1::ts1', t2::ts2' ->
if rank t1 < rank t2 then t1 :: merge ts1' ts2
else if rank t2 < rank t1 then t2 :: merge ts1 ts2'
else ins_tree (link t1 t2) (merge ts1' ts2')
let rec remove_min_tree = function
| [] -> raise EmptyStructure
| [t] -> t, []
| t::ts ->
let t',ts' = remove_min_tree ts in
if Element.leq (root t) (root t')
then (t, ts)
else (t', t::ts')
let find_min ts =
let t,_ = remove_min_tree ts in root t
let delete_min ts =
let Node(_,x,ts1),ts2 = remove_min_tree ts in
merge (List.rev ts1) ts2
end
|