I was trying to figure out the time complexity of suc which lead me to the matchGr function.
|
matchGr :: Node -> Gr a b -> Decomp Gr a b |
|
matchGr node (Gr g) |
|
= case IM.lookup node g of |
|
Nothing |
|
-> (Nothing, Gr g) |
|
|
|
Just (p, label, s) |
|
-> let !g1 = IM.delete node g |
|
!p' = IM.delete node p |
|
!s' = IM.delete node s |
|
!g2 = clearPred g1 node s' |
|
!g3 = clearSucc g2 node p' |
|
in (Just (toAdj p', node, label, toAdj s), Gr g3) |
All the work being done with the bang patterns does not seem to be necessary for the suc function as far as I can tell. I think the strict evaluation could cause the asymptotic complexity of the suc function to change from O(k + min(n,W)) (where k is the number of nodes in the output and n and W are the familiar IntMap variables) to O(n) (because of the clearPred and clearSucc functions). Should this be rewritten to:
matchGr :: Node -> Gr a b -> Decomp Gr a b
matchGr node (Gr g)
= case IM.lookup node g of
Nothing
-> (Nothing, Gr g)
Just (p, label, s)
-> let g1 = IM.delete node g
p' = IM.delete node p
s' = IM.delete node s
g2 = clearPred g1 node s'
g3 = clearSucc g2 node p'
in (Just (p' `seq` toAdj p', node, label, toAdj s), g3 `seq` Gr g3)
Or something similar.
I was trying to figure out the time complexity of
sucwhich lead me to thematchGrfunction.fgl/Data/Graph/Inductive/PatriciaTree.hs
Lines 146 to 158 in 86dc04d
All the work being done with the bang patterns does not seem to be necessary for the
sucfunction as far as I can tell. I think the strict evaluation could cause the asymptotic complexity of thesucfunction to change fromO(k + min(n,W))(wherekis the number of nodes in the output andnandWare the familiarIntMapvariables) toO(n)(because of theclearPredandclearSuccfunctions). Should this be rewritten to:Or something similar.