longest'inc'subseq seq = maximum dp
where dp = 1 : [val n | n <- [1..length seq - 1]]
val n = (1 +) . filter'and'get'max ((<= top) . (seq!!)) $ [0..pred n]
where top = seq!!n
-----
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
稱取約1-2S與SEQ的lenght = 1000 而在Python是出來imtermedialyHaskell中最長的非遞減子搜索緩慢。如何提高?
在python
def longest(s):
dp = [0]*len(s)
dp[0] = 1
for i in range(1,len(s)):
need = 0
for j in range (0, i):
if s[j] <= s[i] and dp[j] > need:
need = dp[j]
dp[i] = need + 1
return max(dp)
和SEQ時的長度是10000,Haskell的程序運行sooo long python在10-15s後返回答案
我們可以提高Haskell速度嗎?
感謝,你們讓我相信在Haskell的:) – 2011-05-21 05:11:52
速度比Data.Vector.Unboxed陣列更有效,如DiffUArray例如?如果是這樣,你能解釋一下爲什麼? – is7s 2011-05-21 14:43:04
DiffArray特別慢,因爲它相對天真。它幾年前從核心庫設置中刪除。有關數組庫的比較,請參閱:http://stackoverflow.com/questions/6006304/what-haskell-representation-is-recommended-for-2d-unboxed-pixel-arrays-with-mill/6007139#6007139 – 2011-05-21 16:55:06