Mein erstes Ziel beim Schreiben war es, den kleinstmöglichen Footprint zu ermöglichen. Ich kann mit Zuversicht sagen, dass dieses Ziel erreicht wurde. Leider bleibt mir dabei eine eher langsame Implementierung. Um alle Primzahlen unter 2 Millionen zu generieren, benötigt man auf einem 3Ghz Intel Chip etwa 8 Sekunden.Kann die Ausführungszeit dieses Primzahlgenerators verbessert werden?
Gibt es trotzdem eine Verbesserung der Ausführungszeit dieses Codes mit minimalem Verzicht auf den geringen Speicherbedarf? Oder mache ich das aus funktionaler Sicht falsch?
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 })
aktualisieren
gezwickt ich den Algorithmus und verwaltet 2 Sekunden abrasieren aber doppelt Speicherverbrauch.
/// 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 })
aktualisieren
Anscheinend ich einen alten Compiler wurde mit. Mit der neuesten Version dauert mein ursprünglicher Algorithmus 6.5s statt 8s. Das ist eine ziemliche Verbesserung.
Nur der Vollständigkeit halber, hier ist ein paar mehr Prime-Funktionen: http://pastebin.com/f23c064c – Juliet
Nun, das ist einfach genial! – ChaosPandion