我写这篇文章的最初目标是留下最小的空间。我可以放心地说,这个目标已经实现。不幸的是,这让我的执行速度很慢。要生成200万以下的所有素数,在3Ghz英特尔芯片上需要大约8秒。该素数生成器的执行时间可以提高吗?
有没有办法提高这段代码的执行时间,而对内存占用很小?另外,从功能的角度来看,我是从错误的角度来看待这个问题的吗?
CODE
/// 6.5s for max = 2,000,000
let generatePrimeNumbers max =
let rec generate number numberSequence =
if number * number > max then numberSequence else
let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L)
let newNumberSequence = seq { for i in filteredNumbers -> i }
let newNumber = newNumberSequence |> Seq.find (fun x -> x > number)
generate newNumber newNumberSequence
generate 2L (seq { for i in 2L..max -> i })
更新
我调整的算法和管理,以刮掉2秒但双内存消耗。
/// 5.2s for max = 2,000,000
let generatePrimeNumbers max =
let rec generate number numberSequence =
if number * number > max then numberSequence else
let filteredNumbers = numberSequence |> Seq.filter (fun v -> v = number || v % number <> 0L) |> Seq.toArray |> Array.toSeq
let newNumber = filteredNumbers |> Seq.find (fun v -> v > number)
generate newNumber filteredNumbers
generate 2L (seq { for i in 2L..max -> i })
更新
很显然,我是用一个旧的编译器。使用最新版本,我的原始算法需要6.5s而不是8s。这是一个很大的改进。
只是为了完整性,这里有一些与素数相关的函数:http://pastebin.com/f23c064c – Juliet 2010-01-13 07:04:43
现在,这真是太棒了! – ChaosPandion 2010-01-13 20:52:58