Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 25s
Classic CLRS Huffman code example. ADT:
type tree = Leaf of int * char | Node of int * tree * tree
Build by repeatedly merging two lightest trees (sorted-list pq):
let rec build_tree lst = match lst with
| [t] -> t
| a :: b :: rest ->
let merged = Node (weight a + weight b, a, b) in
build_tree (insert merged rest)
weighted path length (= total Huffman bits):
leaves {(5,a) (9,b) (12,c) (13,d) (16,e) (45,f)} -> 224
Tests sum-typed ADT with mixed arities, `function` keyword
pattern matching, recursive sorted insert, depth-counting recursion.
150 baseline programs total.
39 lines
751 B
OCaml
39 lines
751 B
OCaml
type tree = Leaf of int * char | Node of int * tree * tree
|
|
|
|
let weight = function
|
|
| Leaf (w, _) -> w
|
|
| Node (w, _, _) -> w
|
|
|
|
let rec insert t lst =
|
|
match lst with
|
|
| [] -> [t]
|
|
| h :: rest ->
|
|
if weight t <= weight h then t :: lst
|
|
else h :: insert t rest
|
|
|
|
let rec build_tree lst =
|
|
match lst with
|
|
| [] -> failwith "empty"
|
|
| [t] -> t
|
|
| a :: b :: rest ->
|
|
let merged = Node (weight a + weight b, a, b) in
|
|
build_tree (insert merged rest)
|
|
|
|
let rec depth d t =
|
|
match t with
|
|
| Leaf (w, _) -> w * d
|
|
| Node (_, l, r) -> depth (d + 1) l + depth (d + 1) r
|
|
|
|
;;
|
|
|
|
let initial = [
|
|
Leaf (5, 'a');
|
|
Leaf (9, 'b');
|
|
Leaf (12, 'c');
|
|
Leaf (13, 'd');
|
|
Leaf (16, 'e');
|
|
Leaf (45, 'f')
|
|
] in
|
|
let t = build_tree initial in
|
|
depth 0 t
|