ocaml: phase 5.1 kmp.ml baseline (5 occurrences of "abab" in haystack)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 21s
Knuth-Morris-Pratt linear-time string search: - kmp_table builds failure function in O(|pattern|) - kmp_search scans text once in O(|text|), counting matches - After a hit, k := t.(n-1) so overlapping matches still count kmp_search "abababcabababcababcc" "abab" = 5 Hits at positions 0, 2, 7, 9, 14 (overlapping at 0/2 and 7/9). Tests: nested while-inside-for, char inequality (.<>), pat.[i] string indexing, Array.make 0, combined string + array indexing. 140 baseline programs total.
This commit is contained in:
@@ -79,6 +79,7 @@
|
|||||||
"josephus.ml": 11,
|
"josephus.ml": 11,
|
||||||
"json_pretty.ml": 24,
|
"json_pretty.ml": 24,
|
||||||
"kadane.ml": 6,
|
"kadane.ml": 6,
|
||||||
|
"kmp.ml": 5,
|
||||||
"lambda_calc.ml": 7,
|
"lambda_calc.ml": 7,
|
||||||
"majority_vote.ml": 4,
|
"majority_vote.ml": 4,
|
||||||
"levenshtein.ml": 11,
|
"levenshtein.ml": 11,
|
||||||
|
|||||||
37
lib/ocaml/baseline/kmp.ml
Normal file
37
lib/ocaml/baseline/kmp.ml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
let kmp_table pat =
|
||||||
|
let n = String.length pat in
|
||||||
|
let t = Array.make n 0 in
|
||||||
|
let k = ref 0 in
|
||||||
|
for i = 1 to n - 1 do
|
||||||
|
while !k > 0 && pat.[!k] <> pat.[i] do
|
||||||
|
k := t.(!k - 1)
|
||||||
|
done;
|
||||||
|
if pat.[!k] = pat.[i] then k := !k + 1;
|
||||||
|
t.(i) <- !k
|
||||||
|
done;
|
||||||
|
t
|
||||||
|
|
||||||
|
let kmp_search text pat =
|
||||||
|
let m = String.length text in
|
||||||
|
let n = String.length pat in
|
||||||
|
if n = 0 then 0
|
||||||
|
else begin
|
||||||
|
let t = kmp_table pat in
|
||||||
|
let count = ref 0 in
|
||||||
|
let k = ref 0 in
|
||||||
|
for i = 0 to m - 1 do
|
||||||
|
while !k > 0 && pat.[!k] <> text.[i] do
|
||||||
|
k := t.(!k - 1)
|
||||||
|
done;
|
||||||
|
if pat.[!k] = text.[i] then k := !k + 1;
|
||||||
|
if !k = n then begin
|
||||||
|
count := !count + 1;
|
||||||
|
k := t.(n - 1)
|
||||||
|
end
|
||||||
|
done;
|
||||||
|
!count
|
||||||
|
end
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
kmp_search "abababcabababcababcc" "abab"
|
||||||
@@ -407,6 +407,13 @@ _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-10 Phase 5.1 — kmp.ml baseline (KMP string search, count
|
||||||
|
occurrences of "abab" in "abababcabababcababcc" = 5). Two-phase
|
||||||
|
classic: build failure table in O(m), then linear scan in O(n).
|
||||||
|
After a full match, set k := t.(n-1) so overlapping matches still
|
||||||
|
count (so "abab" hits at positions 0, 2, 7, 9, 14). Tests nested
|
||||||
|
while-inside-for, char comparison via `pat.[i]`, Array.make 0,
|
||||||
|
combined string + array indexing. 140 baseline programs total.
|
||||||
- 2026-05-10 Phase 5.1 — union_find.ml baseline (disjoint-set union
|
- 2026-05-10 Phase 5.1 — union_find.ml baseline (disjoint-set union
|
||||||
on n=10 with 6 unions → 4 components). Path-compressing find:
|
on n=10 with 6 unions → 4 components). Path-compressing find:
|
||||||
recursively walks parent links, splices subtree onto root in place.
|
recursively walks parent links, splices subtree onto root in place.
|
||||||
|
|||||||
Reference in New Issue
Block a user