Longest increasing subsequence: Difference between revisions

Content added Content deleted
Line 458: Line 458:


lis :: Ord a => [a] -> [a]
lis :: Ord a => [a] -> [a]
lis lst = runST $ do
lis xs = runST $ do
let llst = length lst
let lxs = length xs
pileTops <- newSTArray (min llst 1, lst) []
pileTops <- newSTArray (min lxs 1, xs) []
let bsearchPiles x len = aux 1 len where
let bsearchPiles x len = aux 1 len where
aux lo hi | lo > hi = return lo
aux lo hi | lo > hi = return lo
Line 477: Line 477:
readArray pileTops (i-1)
readArray pileTops (i-1)
return $ if i == len+1 then len+1 else len
return $ if i == len+1 then len+1 else len
len <- foldM f 0 lst
len <- foldM f 0 xs
return . reverse =<< readArray pileTops len
return . reverse =<< readArray pileTops len
where newSTArray :: Ix i => (i,i) -> e -> ST s (STArray s i e)
where newSTArray :: Ix i => (i,i) -> e -> ST s (STArray s i e)