progress with insert function, adding note for next todo

This commit is contained in:
2024-09-03 20:16:39 +01:00
parent 2f14c99952
commit f518ebb4b3

View File

@@ -22,7 +22,7 @@ struct
else else
NONE NONE
fun binSearch (findChr, keyPos, children) = fun findBinSearch (findChr, keyPos, children) =
if Vector.length children > 0 then if Vector.length children > 0 then
helpBinSearch (findChr, keyPos, children, 0, Vector.length children - 1) helpBinSearch (findChr, keyPos, children, 0, Vector.length children - 1)
else else
@@ -75,7 +75,7 @@ struct
let let
val findChr = String.sub (searchKey, keyPos) val findChr = String.sub (searchKey, keyPos)
in in
(case binSearch (findChr, keyPos, keys) of (case findBinSearch (findChr, keyPos, keys) of
SOME idx => SOME idx =>
let let
val trieKey = Vector.sub (keys, idx) val trieKey = Vector.sub (keys, idx)
@@ -99,7 +99,7 @@ struct
let let
val findChr = String.sub (searchKey, keyPos) val findChr = String.sub (searchKey, keyPos)
in in
(case binSearch (findChr, keyPos, keys) of (case findBinSearch (findChr, keyPos, keys) of
SOME idx => SOME idx =>
let let
val trieKey = Vector.sub (keys, idx) val trieKey = Vector.sub (keys, idx)
@@ -121,12 +121,56 @@ struct
end end
| FOUND => keyPos = String.size searchKey | FOUND => keyPos = String.size searchKey
datatype insert_string_match =
NO_INSERT_MATCH
(* may need to split string if difference found but prefix matched *)
| DIFFERENCE_FOUND_AT of int
(* no need to do anything if insert key matched,
* as this is a set where only strings are stored *)
| FULL_INSERT_MATCH
(* if insert key contains trie key, may need to recurse down node *)
| INSERT_KEY_CONTAINS_TRIE_KEY
(* if trie key contains insert key, need to split node *)
| TRIE_KEY_CONTAINS_INSERT_KEY
fun insertKeyMatch (insertKey, trieKey, keyPos) =
if
keyPos < String.size insertKey
then
if keyPos < String.size trieKey then
let
val searchChr = String.sub (insertKey, keyPos)
val trieChr = String.sub (trieKey, keyPos)
in
if searchChr = trieChr then
insertKeyMatch (insertKey, trieKey, keyPos + 1)
else
DIFFERENCE_FOUND_AT keyPos
end
else
INSERT_KEY_CONTAINS_TRIE_KEY
else if
keyPos = String.size insertKey
then
if keyPos < String.size trieKey then TRIE_KEY_CONTAINS_INSERT_KEY
else if keyPos = String.size trieKey then FULL_INSERT_MATCH
else INSERT_KEY_CONTAINS_TRIE_KEY
else
(* implicit: keyPos > String.size insertKey *)
if keyPos <= String.size trieKey then
TRIE_KEY_CONTAINS_INSERT_KEY
else
NO_INSERT_MATCH
(* (*
* todo: * todo:
* Code insert function, with an insertKeyMatch helper function * Code another function for binary search; this time for insert.
* which is similar to the searchKeyMatch helper function, * The difference between findBinSearch and insertBinSearch
* except that it may also return the index to split a node at * should be that, while findBinSearch returns NONE if the value is not found,
* in a new datatype. * insertBinSearch should return the appropriate index to insert at
* if the value is not found.
* The main insert function can then create new key/children vectors,
* containing the insertKey and FOUND at the appropriate index.
*) *)
fun insert (insKey, keyPos, trie) = fun insert (insKey, keyPos, trie) =