Не имея ничего, кроме по-настоящему бессмысленной упаковки ваших списков в векторы, я получаю 2,5 секунды, когда входной список равен [1..10000]
.
import qualified Data.Vector as V
import Data.Vector (Vector, (!))
main = print $ liss [0..10000]
liss :: [Int] -> Int
liss seqL = V.maximum dp
where dp = V.fromList $ 1 : [val n | n <- [1..length seqL - 1]]
seq = V.fromList seqL
val n = (1 +) . filter'and'get'max ((<= top) . (seq!)) $ [0..pred n]
where top = seq!n
-----
filter'and'get'max :: (Int -> Bool) -> [Int] -> Int
filter'and'get'max f [] = 0
filter'and'get'max f [x] = if f x then dp!x else 0
filter'and'get'max f (x:xs) = if f x then ( if vx > vxs then vx else vxs ) else vxs
where vx = dp!x
vxs = filter'and'get'max f xs
Компиляция и исполнение:
tommd@Mavlo:Test$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.0.3
tommd@Mavlo:Test$ ghc -O2 so.hs
[1 of 1] Compiling Main ( so.hs, so.o )
Linking so ...
tommd@Mavlo:Test$ time ./so
10001
real 0m2.536s
user 0m2.528s
Преобразование «рабочий-обертка» на filter'and'get'max
, кажется, сбрасывает еще одну секунду.
Кроме того, я не понимаю, зачем вам этот средний регистр (filter'and'get'max f [x]
), разве он не может нормально работать без этого? Я думаю, это изменит результат, если dp!x < 0
. Примечание устранение, которое экономит 0,3 секунды прямо там.
И предоставленный вами код Python занимает ~ 10,7 секунды (добавлен вызов longest(range(1,10000));
).
tommd@Mavlo:Test$ time python so.py
real 0m10.745s
user 0m10.729s