progress with insert function, adding note for next todo
This commit is contained in:
@@ -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) =
|
||||||
|
|||||||
Reference in New Issue
Block a user