Oto prosty problem programistyczny SPOJ: http://www.spoj.com/problems/PROBTRES/ .
Zasadniczo zostaniesz poproszony o podanie największego cyklu Collatza dla liczb między i i j. (Cykl Collatz liczby $ n $ to liczba kroków, które ostatecznie można uzyskać z $ n $ do 1.)
Szukałem sposobu Haskell, aby rozwiązać problem z wydajnością porównawczą niż w Javie lub C ++ (tak, aby pasował do dozwolonego limitu czasu działania). Chociaż proste rozwiązanie Java, które zapamiętuje długość każdego już obliczonego cyklu, będzie działać, nie udało mi się zastosować pomysłu uzyskania rozwiązania Haskell.
Wypróbowałem Data.Function.Memoize, a także technikę zapamiętywania czasu zapisanego w dzienniku domowym, korzystając z pomysłu z tego postu: /programming/3208258/memoization-in-haskell . Niestety zapamiętywanie powoduje, że obliczenia cyklu (n) są jeszcze wolniejsze. Uważam, że spowolnienie pochodzi z górnej części drogi Haskell. (Próbowałem uruchomić ze skompilowanym kodem binarnym, zamiast interpretować.)
Podejrzewam również, że zwykłe iterowanie liczb od i do j może być kosztowne ($ i, j \ le10 ^ 6 $). Próbowałem nawet wstępnie obliczyć wszystko dla zapytania o zakres, używając pomysłu z http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Nadal jednak pojawia się błąd „Przekroczenie limitu czasu”.
Czy możesz pomóc w poinformowaniu o tym porządnego konkurencyjnego programu Haskell?