ocaml: phase 5.1 bfs.ml baseline (20/20 pass)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 20s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 20s
Graph BFS using Queue + Hashtbl visited-set + List.assoc_opt + List.iter. Returns 6 for a graph where A reaches B/C/D/E/F. Demonstrates 4 stdlib modules (Queue, Hashtbl, List) cooperating in a real algorithm.
This commit is contained in:
43
lib/ocaml/baseline/bfs.ml
Normal file
43
lib/ocaml/baseline/bfs.ml
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
(* Baseline: graph BFS using Queue + Hashtbl visited set.
|
||||||
|
Returns the count of reachable nodes. *)
|
||||||
|
|
||||||
|
(* Adjacency as an assoc list of (node, neighbors). *)
|
||||||
|
let graph =
|
||||||
|
[ ("A", ["B"; "C"])
|
||||||
|
; ("B", ["D"])
|
||||||
|
; ("C", ["D"; "E"])
|
||||||
|
; ("D", ["F"])
|
||||||
|
; ("E", ["F"])
|
||||||
|
; ("F", [])
|
||||||
|
]
|
||||||
|
;;
|
||||||
|
|
||||||
|
let neighbors n =
|
||||||
|
match List.assoc_opt n graph with
|
||||||
|
| None -> []
|
||||||
|
| Some ns -> ns
|
||||||
|
;;
|
||||||
|
|
||||||
|
let bfs start =
|
||||||
|
let visited = Hashtbl.create 16 in
|
||||||
|
let q = Queue.create () in
|
||||||
|
Queue.push start q ;
|
||||||
|
Hashtbl.add visited start true ;
|
||||||
|
let rec loop () =
|
||||||
|
if Queue.is_empty q then ()
|
||||||
|
else
|
||||||
|
let v = Queue.pop q in
|
||||||
|
List.iter
|
||||||
|
(fun n ->
|
||||||
|
if not (Hashtbl.mem visited n) then begin
|
||||||
|
Hashtbl.add visited n true ;
|
||||||
|
Queue.push n q
|
||||||
|
end)
|
||||||
|
(neighbors v) ;
|
||||||
|
loop ()
|
||||||
|
in
|
||||||
|
loop () ;
|
||||||
|
Hashtbl.length visited
|
||||||
|
;;
|
||||||
|
|
||||||
|
bfs "A"
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"anagrams.ml": 3,
|
"anagrams.ml": 3,
|
||||||
|
"bfs.ml": 6,
|
||||||
"btree.ml": 39,
|
"btree.ml": 39,
|
||||||
"calc.ml": 13,
|
"calc.ml": 13,
|
||||||
"closures.ml": 315,
|
"closures.ml": 315,
|
||||||
|
|||||||
@@ -407,6 +407,10 @@ _Newest first._
|
|||||||
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree *
|
||||||
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
'a tree`) with insert + in-order traversal. Tests parametric ADT,
|
||||||
recursive match, List.append, List.fold_left.
|
recursive match, List.append, List.fold_left.
|
||||||
|
- 2026-05-08 Phase 5.1 — bfs.ml baseline (20/20 pass). Graph
|
||||||
|
breadth-first search using Queue + Hashtbl visited-set + List.assoc_opt
|
||||||
|
+ List.iter. Returns the count of reachable nodes (6 for the demo
|
||||||
|
graph A→B→D→F, A→C→{D,E}, E→F).
|
||||||
- 2026-05-08 Phase 1 — type annotations on let-bindings and parens
|
- 2026-05-08 Phase 1 — type annotations on let-bindings and parens
|
||||||
expressions (+4 tests, 473 total). `let NAME [PARAMS] : T = expr`
|
expressions (+4 tests, 473 total). `let NAME [PARAMS] : T = expr`
|
||||||
and `(expr : T)` parse and skip the type source. Runtime no-op
|
and `(expr : T)` parse and skip the type source. Runtime no-op
|
||||||
|
|||||||
Reference in New Issue
Block a user