Hier ist ein einfaches Programmierproblem von SPOJ: http://www.spoj.com/problems/PROBTRES/ .
Grundsätzlich werden Sie aufgefordert, den größten Collatz-Zyklus für Zahlen zwischen i und j auszugeben. (Collatz-Zyklus einer Zahl $ n $ ist die Anzahl der Schritte, die letztendlich von $ n $ auf 1 kommen.)
Ich habe nach einer Haskell-Methode gesucht, um das Problem mit einer vergleichbaren Leistung als der von Java oder C ++ zu lösen (um das zulässige Laufzeitlimit einzuhalten). Obwohl eine einfache Java-Lösung, die die Zykluslänge aller bereits berechneten Zyklen speichert, funktioniert, konnte ich die Idee, eine Haskell-Lösung zu erhalten, nicht erfolgreich anwenden.
Ich habe das Data.Function.Memoize-Verfahren sowie das hausgemachte Protokollzeit-Memoization-Verfahren mit der Idee aus diesem Beitrag ausprobiert: /programming/3208258/memoization-in-haskell . Leider macht das Auswendiglernen die Berechnung von Zyklus (n) sogar noch langsamer. Ich glaube, die Verlangsamung kommt von der Höhe des Haskell-Weges. (Ich habe versucht, mit dem kompilierten Binärcode zu arbeiten, anstatt ihn zu interpretieren.)
Ich vermute auch, dass die einfache Iteration von Zahlen von i nach j kostspielig sein kann ($ i, j \ le10 ^ 6 $). Also habe ich sogar versucht, alles für die Bereichsabfrage vorab zu berechnen. Dabei habe ich die Idee von http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html verwendet . Dies gibt jedoch immer noch den Fehler "Zeitlimitüberschreitung".
Können Sie dazu beitragen, ein ordentliches wettbewerbsfähiges Haskell-Programm zu informieren?