Mục tiêu ban đầu của tôi khi viết điều này là để lại dấu chân nhỏ nhất có thể. Tôi có thể nói với sự tự tin rằng mục tiêu này đã được đáp ứng. Thật không may, điều này lá tôi với một thực hiện khá chậm. Để tạo ra tất cả các số nguyên tố dưới 2 triệu, mất khoảng 8 giây trên chip Intel 3Ghz.Thời gian thực thi của bộ tạo số nguyên tố này có được cải thiện không?
Có cách nào để cải thiện thời gian thực thi của mã này với sự hy sinh tối thiểu cho bộ nhớ nhỏ không? Ngoài ra, tôi đang đi về điều này một cách sai lầm khi nhìn vào nó từ một quan điểm chức năng?
MÃ
/// 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 })
Cập nhật
tôi tinh chỉnh các thuật toán và quản lý để cạo 2 giây nhưng tiêu thụ bộ nhớ kép.
/// 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 })
Cập nhật
Rõ ràng, tôi đã sử dụng một trình biên dịch cũ. Với phiên bản mới nhất, thuật toán gốc của tôi mất 6.5s thay vì 8 giây. Đó là một cải tiến khá.
Chỉ cần cho đầy đủ, đây là một số chức năng liên quan đến nguyên tố: http://pastebin.com/f23c064c – Juliet
Bây giờ điều đó thật tuyệt vời! – ChaosPandion