Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.07 KB | None | 0 0
  1. module type OrderedSig = sig
  2. type t
  3. val eq : t -> t -> bool
  4. val lt : t -> t -> bool
  5. val leq : t -> t -> bool
  6. end
  7.  
  8. module Int : OrderedSig = struct
  9.  
  10. type t = int
  11. let eq (a : t) (b : t) = a=b
  12. let lt (a : t) (b : t) = a<b
  13. let leq (a : t) (b : t) = a<=b
  14. end
  15.  
  16.  
  17. module type BinomialHeapSig = sig
  18. type elem
  19. type tree = Node of int * elem * tree list
  20. type t = tree list
  21.  
  22.  
  23. val empty : t -> t
  24. val isEmpty : t -> bool
  25.  
  26. val insert : elem -> t -> t
  27. val merge : t -> t -> t
  28.  
  29. val findMin : t -> elem
  30.  
  31. val deleteMin : t -> t
  32.  
  33. end
  34.  
  35. module BinomialHeap (S : OrderedSig) : BinomialHeapSig = struct
  36. type elem = S.t
  37. (* Something about t and tree types, not sure about def*)
  38. type t
  39. (* Fix *)
  40. type tree = Node of int * elem * tree list
  41.  
  42. let empty = []
  43. let isEmpty (ts : t) : bool = ts <> []
  44. let root ((_, x, _) : tree) = x
  45. let rank ((r, _, _) : tree) = r
  46.  
  47. let rec insertTree (t1 : t) (t2 : t) =
  48. match (t1, t2) with
  49. | (t1, []) -> [t1]
  50. | (t1, t2 as t :: ts) -> if rank t1 < rank t
  51. then t :: ts
  52. else insertTree(link (t1, t) ts)
  53.  
  54. let link ((r, x1, c1) : tree) ((_, x2, c2) : tree) =
  55. if Elem.leq x1 x2
  56. then Node(r+1, x1, t2 :: c1)
  57. else Node(r+1, x2, t1 :: c2)
  58.  
  59. let insert (e : elem) (tr : t) =
  60. match (e, tree) with
  61. | (e, []) -> [e]
  62. | (e, (t :: ts)) ->
  63. if rank t < rank f then f:: ts else insTree (link (t, t ), ts')
  64.  
  65. let merge ts1 ts2 =
  66. match (ts1, ts2) with
  67. | (ts1, []) -> ts1
  68. | ([], ts2) -> []
  69. | (t1 :: t1s, t2 :: t2s) ->
  70. if (rank t1) < (rank t2) then t1 :: merge t1s ts2
  71. else if (rank t2) < (rank t1) then t2 :: merge ts1 t2s
  72. else insertTree (link t1 t2), merge t1s t2s
  73.  
  74.  
  75. let removeMinTree t =
  76. match t with
  77. | [] -> raise Failure("Empty")
  78. | t -> (t, [])
  79. | t :: ts ->
  80. let (t', ts') = removeMinTree ts in
  81. if Elem.leq (root t) (root t') then (t, ts) else (t', t::ts')
  82.  
  83.  
  84. let findMin ts =
  85. let (t, _) = removeMinTree ts in
  86. root t
  87.  
  88. let deleteMin ts =
  89. let (Node(_, x, ts1), ts2) = removeMinTree ts in
  90. merge (rev ts1, ts2)
  91. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement