From 738e7d93d1f57f31111c9f4305941d9542aa3995 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 7 Sep 2024 21:54:11 +0100 Subject: [PATCH] fix all bugs in remove5; now, all remove tests have been ported and they all pass fully; should port other tests from KTrie next too --- src/string-set.sml | 39 ++++++++++++++++++++++++------------- tests/string-set-tests | Bin 286544 -> 286544 bytes tests/string-set-tests.sml | 2 -- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/string-set.sml b/src/string-set.sml index f0bf5d0..5f706b0 100644 --- a/src/string-set.sml +++ b/src/string-set.sml @@ -532,7 +532,8 @@ struct (* should be called when there is a FULL_SEARCH_MATCH * and child is a terminal FOUND node *) - fun removeWhenChildIsMadeEmpty (idx, keys, children, parentConstructor) = + fun removeWhenChildIsMadeEmpty + (idx, keys, children, isFoundWithChildren, parentConstructor) = (* if child was made empty, then: * - if the parent only has 1 child, it should be MADE_EMPTY too * - otherwise, just remove the key and child at this idx from parent @@ -569,12 +570,23 @@ struct in CHANGED newNode end - 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 *) - fun removeWhenFullMatch (idx, keys, children, parentConstructor) = + fun removeWhenFullMatch + (idx, keys, children, isFoundWithChildren, parentConstructor) = (* matching over the child at this idx *) case Vector.sub (children, idx) of (* CHILDREN is a not-found case, so have to leave parent unchanged @@ -596,10 +608,11 @@ struct CHANGED newParent end | FOUND => - removeWhenChildIsMadeEmpty (idx, keys, children, parentConstructor) + removeWhenChildIsMadeEmpty + (idx, keys, children, isFoundWithChildren, parentConstructor) fun removeWhenSearchKeyContainsTrieKey - (childResult, idx, keys, children, parentConstructor) = + (childResult, idx, keys, children, isFoundWithChildren, parentConstructor) = case childResult of (* if result is UNCHANGED, let UNCHANGED bubble to the top. * At the top, can return same trie given as input as there was no @@ -619,7 +632,8 @@ struct CHANGED newNode end | MADE_EMPTY => - removeWhenChildIsMadeEmpty (idx, keys, children, parentConstructor) + removeWhenChildIsMadeEmpty + (idx, keys, children, isFoundWithChildren, parentConstructor) fun helpRemove (removeKey, keyPos, trie) = case trie of @@ -636,7 +650,7 @@ struct (* no search match means nothing to delete *) NO_SEARCH_MATCH => UNCHANGED | FULL_SEARCH_MATCH => - removeWhenFullMatch (idx, keys, children, CHILDREN) + removeWhenFullMatch (idx, keys, children, false, CHILDREN) | SEARCH_KEY_CONTAINS_TRIE_KEY => removeWhenSearchKeyContainsTrieKey ( helpRemove @@ -647,6 +661,7 @@ struct , idx , keys , children + , false , CHILDREN ) | TRIE_KEY_CONTAINS_SEARCH_KEY => UNCHANGED) @@ -667,7 +682,7 @@ struct NO_SEARCH_MATCH => UNCHANGED | FULL_SEARCH_MATCH => removeWhenFullMatch - (idx, keys, children, FOUND_WITH_CHILDREN) + (idx, keys, children, true, FOUND_WITH_CHILDREN) | SEARCH_KEY_CONTAINS_TRIE_KEY => removeWhenSearchKeyContainsTrieKey ( helpRemove @@ -678,6 +693,7 @@ struct , idx , keys , children + , true , FOUND_WITH_CHILDREN ) | TRIE_KEY_CONTAINS_SEARCH_KEY => UNCHANGED) @@ -701,9 +717,4 @@ struct CHANGED trie => trie | MADE_EMPTY => empty | UNCHANGED => trie - -(* - * todo: - * test remove functionality - * *) end diff --git a/tests/string-set-tests b/tests/string-set-tests index 4b5879223dcaf72cf58091ccb0f12ee73ca75881..617a2b08a70ef96c8ccfa280e06bee5388bad8fb 100755 GIT binary patch delta 22823 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
  • nuRqZK zy9UQfU?uQ4@EXt#ybr7d27iwk2BrZ0!?FL<@uqV)Mh;8><^ab5^MEFx9cTg80t z>N=q#U@*}8MuVdlFc@eACIHicDZs_Rbf5(|AD9bV2`mI|1ilT-16}|g1%3xC1=a%3 z0R3whBzFC9{A(I z_6~;$nAhGh)v+9J5<23;Dd7B2hvOP>WthX!xhE8W3BcfRI0Q`Z0bXEF@VzioyX8{+$V0U5APss5Slpo;(0*yMh zv}Ay66o0)&3B!~0`ZY@XW~Qz6j;iS#x>ngv#kQB%DzgcH+2FHI=_FTO#WyRJuJ|h9 z!F5UyFJ7m3;~U>mpuDOS*cRe2Je_@Kow9-O!CSHgUTp7&OfOu(OL%eI3kNY|aZZVA zsCLLs@v{~T^*A51D4o#bM*_%l8zPNQsT;;R=Ipr}bVQdWykmp8$vj`wYXj)m(tDfr(7JbSZ}fuWXf#u&Hr_W}ypCr1$<^d#pf!va28 z{$MH-;OG@p3YEM+M;Vy3b|rGN#`j(*3YJ3VoEXRj8X;TWM3yG>SiePSleD-AwHDNZ zCT4d-HouANC}inu7AD3up+u=Ns)s0(P9JcLOA;I!d=Rc zfSeN#x)$k7LfN&F-w}$rd`rM7?zkHsU*Xxim7W3qC}^~L%ked=ymkX+pQ?1xXe*B0P1G4ab0T=kZRT(BW;2xyi^tW(; zLS4L!_}Pt0Y(9_QG};O|iV8Mq)9H)0(?Ib&KiEj(_EqR+q;xd;Y)uAPgR>jf?MXvHMW zf<}VIsE{p%EDkdFWC}|gA&cSUeXx|k=6y)Dqww8jT%F@0KtTH02XiD+t|&82{IyWr z&R)+WKoA+vL%)hsU6APl>+?9au6_7mSi%DdU4GX@))ulVu6SN-oF(S@93qEv})XJpzw9bf z>cILurA$^^D)a;9Ju#UT@dSa9JTB?$>CV6$^;njBWm1}w(NXmKL^w=*ymiqb?tks%w66YA@Q)=5ZK>Y6 z3E~6$0w3Ko$fhB_fE2d+>PDipyX>pO_l5E2%RagQTUS5b|1?8UL~V2ls3%K*^Evo1PKrT^pUI~jCV%m*&IP^E+MxJ!6mrOMB! zKJ`}RM?Z4u4F+;UGj6781YI|<%OTQl=D{sI(>-!qD$!u zwX+RwC8j_OA^$5Eyq0Vj=xZ+7_i9%gWm^ar5I&zqcHmT!vX|=+B2@lc* z;ad?pe;yU2s}hp)eWAWud~P zxv|MNFymsX@|nWW|4QeSgczS{JiPPJ62mjHISjp|^C~EZRAo1|<=)LPTrO-`xJD>1 zU>^gN4V(W;xs_xQJq8Ci>F}D`A$Fqy^O?u`a9A{PayTqXJRMgdRk?p$8;NN9Fm*vV;VKOm&nOjmcK)EI2$ zD@m+KSqb`$is#hn`MlZJ# zM`IV59F^jt-J9Z~YSP59U7WLF?gEo0F6x2-O1)HDs(VYCyZX=P@UF0BnCPP2IW5RNAQ0eryGepeh$&=bA_?kcoY|i#3;BCfzIWx!T6SsomlE z#;qrilP%~f^?Oe!2A!|p)z&&L0gWQzqwZKgJlW}iZEEMt9_Sybq6eB< zdb=#A$gZZ_P-KZQN?ZXN?p=p+h&|1vbw%yqQ&p=M$M%GgrR1XB6NL@zG~&-@K^qRa zXm{b%PNnnND(HN5)y}BKyQs8<%X`An-CQHIEaP29+;&@|*5Y#$;j)oq zdt;Jv*etaCOs+oM5uS*OM`)qC6m+5Ls5{ECReB7gwI(wfg4GocZErH#cvbGr*?pXISPiRUNA`ukMl~|9 zq|Vn%s&YOjgO+b^;Te5(z2z!D-U@_gWqr}upRWtp$RTln?K~O~lH=tH035Z>R|cMH zxF*ONho0_@mqDyft1o6~nKN*9GZsH<`l?_%~swmJI!L-XVr24wvFVi)%c|&iCi4pH8ryAEbLC0oiP215f1kqDt}3(8c73MqG3EaO4X7Yc diff --git a/tests/string-set-tests.sml b/tests/string-set-tests.sml index aecfd40..44a39d0 100644 --- a/tests/string-set-tests.sml +++ b/tests/string-set-tests.sml @@ -126,8 +126,6 @@ struct val trie = StringSet.remove ("x", trie) val _ = assertFalse (StringSet.exists ("x", trie), "x does not exist after remove in remove5") - (* error: "abc" should exist at this point, but it seems not to. - * find out why and fix. *) val _ = assertTrue (StringSet.exists ("abc", trie), "abc exists before remove in remove5") val trie = StringSet.remove ("abc", trie) val _ = assertFalse (StringSet.exists ("abc", trie), "abc does not exist after remove in remove5")