- 論壇徽章:
- 95
|
Sieve of Eratosthenes 算法描述見 http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
Haskell 實(shí)現(xiàn)如下:
- sieve :: [Integer] -> [Integer]
- sieve (x:xs) = x : sieve xs'
- where xs' = filter (\y -> y `mod` x /= 0) xs
- primes = 2 : sieve [3,5..]
復(fù)制代碼
加了平方優(yōu)化后的版本
- sieve :: [Integer] -> [Integer]
- sieve (x:xs) = x : sieve (xs' ++ xs''')
- where
- (xs', xs'') = break (>= x*x) xs
- xs''' = filter (\y -> y `mod` x /= 0) xs''
- primes = 2 : sieve [3,5..]
復(fù)制代碼
實(shí)際上,第二個(gè)版本有嚴(yán)重的性能問(wèn)題(break 會(huì)導(dǎo)致大量的內(nèi)存操作)以至于還沒有第一個(gè)快。
真正優(yōu)化的版本(by win_hate):
- isPrime :: Integer -> [Integer] -> Bool
- isPrime p (x:xs)
- | x*x > p = True
- | p `mod` x == 0 = False
- | otherwise = isPrime p xs
- primes = 2 : [ p | p <- [3,5..], isPrime p primes ]
復(fù)制代碼
BTW,這個(gè)還可以再稍加優(yōu)化。
[ 本帖最后由 MMMIX 于 2009-5-20 14:15 編輯 ] |
|