ocaml: phase 5.1 rolling_hash.ml baseline (Rabin-Karp, 6 "abc" matches)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
Polynomial rolling hash mod 1000003 with base 257: - precompute base^(m-1) - slide window updating hash in O(1) per step - verify hash match with O(m) memcmp to skip false positives rolling_match "abcabcabcabcabcabc" "abc" = 6 Six non-overlapping copies of "abc" at positions 0,3,6,9,12,15. Tests `for _ = 0 to m - 2 do … done` unused loop variable (uses underscore wildcard pattern), Char.code arithmetic, mod arithmetic with intermediate negative subtractions, complex nested if/begin branching with inner break-via-flag. 151 baseline programs total.
This commit is contained in:
@@ -122,6 +122,7 @@
|
|||||||
"quickselect.ml": 5,
|
"quickselect.ml": 5,
|
||||||
"quicksort.ml": 44,
|
"quicksort.ml": 44,
|
||||||
"roman.ml": 44,
|
"roman.ml": 44,
|
||||||
|
"rolling_hash.ml": 6,
|
||||||
"reverse_int.ml": 54329,
|
"reverse_int.ml": 54329,
|
||||||
"rpn.ml": 9,
|
"rpn.ml": 9,
|
||||||
"run_decode.ml": 21,
|
"run_decode.ml": 21,
|
||||||
|
|||||||
38
lib/ocaml/baseline/rolling_hash.ml
Normal file
38
lib/ocaml/baseline/rolling_hash.ml
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
let mod_p = 1000003
|
||||||
|
let base = 257
|
||||||
|
|
||||||
|
let rolling_match text pat =
|
||||||
|
let n = String.length text in
|
||||||
|
let m = String.length pat in
|
||||||
|
if m > n then 0
|
||||||
|
else begin
|
||||||
|
let pat_hash = ref 0 in
|
||||||
|
let win_hash = ref 0 in
|
||||||
|
let high = ref 1 in
|
||||||
|
for _ = 0 to m - 2 do
|
||||||
|
high := (!high * base) mod mod_p
|
||||||
|
done;
|
||||||
|
for i = 0 to m - 1 do
|
||||||
|
pat_hash := (!pat_hash * base + Char.code pat.[i]) mod mod_p;
|
||||||
|
win_hash := (!win_hash * base + Char.code text.[i]) mod mod_p
|
||||||
|
done;
|
||||||
|
let count = ref 0 in
|
||||||
|
for i = 0 to n - m do
|
||||||
|
if !win_hash = !pat_hash then begin
|
||||||
|
let ok = ref true in
|
||||||
|
for j = 0 to m - 1 do
|
||||||
|
if text.[i + j] <> pat.[j] then ok := false
|
||||||
|
done;
|
||||||
|
if !ok then count := !count + 1
|
||||||
|
end;
|
||||||
|
if i < n - m then begin
|
||||||
|
let drop = (Char.code text.[i] * !high) mod mod_p in
|
||||||
|
win_hash := ((!win_hash - drop + mod_p) * base + Char.code text.[i + m]) mod mod_p
|
||||||
|
end
|
||||||
|
done;
|
||||||
|
!count
|
||||||
|
end
|
||||||
|
|
||||||
|
;;
|
||||||
|
|
||||||
|
rolling_match "abcabcabcabcabcabc" "abc"
|
||||||
@@ -407,6 +407,15 @@ _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 — rolling_hash.ml baseline (Rabin-Karp
|
||||||
|
rolling hash for substring matching, count "abc" in
|
||||||
|
"abcabcabcabcabcabc" = 6). Polynomial hash mod 1000003 with
|
||||||
|
base 257; precompute base^(m-1), then slide window updating
|
||||||
|
hash in O(1) per step. Verify hash matches with O(m) memcmp to
|
||||||
|
avoid false positives. Tests `for _ = 0 to m - 2 do … done`
|
||||||
|
unused loop variable, char-code arithmetic, mod under negative
|
||||||
|
intermediate, complex nested if/begin/end branching.
|
||||||
|
151 baseline programs total.
|
||||||
- 2026-05-10 Phase 5.1 — huffman.ml baseline (Huffman tree weighted
|
- 2026-05-10 Phase 5.1 — huffman.ml baseline (Huffman tree weighted
|
||||||
path length on letters {(5,a) (9,b) (12,c) (13,d) (16,e) (45,f)}
|
path length on letters {(5,a) (9,b) (12,c) (13,d) (16,e) (45,f)}
|
||||||
= 224). Builds optimal prefix code by repeatedly merging the two
|
= 224). Builds optimal prefix code by repeatedly merging the two
|
||||||
|
|||||||
Reference in New Issue
Block a user