From 36c9b45c1a44bfa40feadbfc2305a6623e7ca0ea Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 8 Sep 2024 04:41:14 +0100 Subject: [PATCH] handle duplicates in insertion into trie properly (return same trie if it already has a FOUND/FOUND_WITH_CHILDREN node awith that key, or change tag of node from CHILDREN to FOUND_WITH_CHILDREN to mark it as inserted --- src/string-set.sml | 43 ++++++++++++++++++++++++------------- tests/string-set-tests | Bin 286544 -> 286544 bytes tests/string-set-tests.sml | 13 +++++++++++ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/string-set.sml b/src/string-set.sml index 5e470bc..08c7a22 100644 --- a/src/string-set.sml +++ b/src/string-set.sml @@ -416,9 +416,24 @@ struct * the tag/case. *) | FULL_INSERT_MATCH => (* in case of a full match, - * returned node should always be FOUND_WITH_CHILDREN, - * because full match means this key was inserted into the trie. *) - FOUND_WITH_CHILDREN {keys = keys, children = children} + * need to turn child into FOUND_WITH_CHILDREN + * or FOUND case, if it not already either + *) + (case Vector.sub (children, insIdx) of + CHILDREN {keys = childKeys, children = childChildren} => + let + val newTrieChild = + FOUND_WITH_CHILDREN + {keys = childKeys, children = childChildren} + val newParentChildren = + Vector.mapi + (fn (childIdx, elt) => + if insIdx <> childIdx then elt else newTrieChild) + children + in + constructor {keys = keys, children = newParentChildren} + end + | _ => trie) (* if insert key contains trie key, need to recurse down node *) | INSERT_KEY_CONTAINS_TRIE_KEY => let @@ -572,18 +587,16 @@ struct in CHANGED newNode end - else - (* if the caller was from the FOUND_WITH_CHILDREN case, - * then, instead of deleting this node entirely, - * we only delete this node's children, and mark this node - * as found. - * However, in general case where this is a CHILDREN node - * whose key was not inserted into the trie, - * we should fully delete this node as well. *) - if isFoundWithChildren then - CHANGED FOUND - else - MADE_EMPTY + else (* if the caller was from the FOUND_WITH_CHILDREN case, + * then, instead of deleting this node entirely, + * we only delete this node's children, and mark this node + * as found. + * However, in general case where this is a CHILDREN node + * whose key was not inserted into the trie, + * we should fully delete this node as well. *) if isFoundWithChildren then + CHANGED FOUND + else + MADE_EMPTY (* should be called when searchKeyMatch returns FULL_MATCH *in helpRemove function *) diff --git a/tests/string-set-tests b/tests/string-set-tests index 617a2b08a70ef96c8ccfa280e06bee5388bad8fb..235ee4db892fe511ac4b426d7429145ccca37ac6 100755 GIT binary patch delta 44872 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 delta 43970 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 TXX%vFyJSzsCqVgxv#sD?6`YO8 diff --git a/tests/string-set-tests.sml b/tests/string-set-tests.sml index 44a39d0..53fb37b 100644 --- a/tests/string-set-tests.sml +++ b/tests/string-set-tests.sml @@ -136,6 +136,17 @@ struct print "StringSet.remove: passed remove5\n" end + fun insert1 () = + let + val trie = StringSet.empty + val _ = assertFalse (StringSet.exists ("abc", trie), "abc does not exist before it is added to trie") + + val trie = StringSet.insert ("abc", trie) + val _ = assertTrue (StringSet.exists ("abc", trie), "abc exists after being addedd to trie") + in + print "StringSet.insert: passed add1\n" + end + fun run () = let val _ = testExists () @@ -146,6 +157,8 @@ struct val _ = remove3 () val _ = remove4 () val _ = remove5 () + + val _ = insert1 () in () end