-
Notifications
You must be signed in to change notification settings - Fork 56
Open
Description
I was trying to figure out the time complexity of suc which lead me to the matchGr function.
fgl/Data/Graph/Inductive/PatriciaTree.hs
Lines 146 to 158 in 86dc04d
| 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.
Metadata
Metadata
Assignees
Labels
No labels