Ecco un semplice problema di programmazione da SPOJ: http://www.spoj.com/problems/PROBTRES/ .
Fondamentalmente, ti viene chiesto di produrre il più grande ciclo di Collatz per i numeri tra i e j. (Il ciclo di Collatz di un numero $ n $ è il numero di passaggi che possono eventualmente passare da $ n $ a 1.)
Ho cercato un modo Haskell per risolvere il problema con prestazioni comparative rispetto a quello di Java o C ++ (in modo da adattarsi al limite di runtime consentito). Sebbene una semplice soluzione Java che memorizza la durata del ciclo di tutti i cicli già calcolati funzionerà, non sono riuscito ad applicare l'idea di ottenere una soluzione Haskell.
Ho provato Data.Function.Memoize e la tecnica di memorizzazione dei tempi di log prodotta in casa usando l'idea di questo post: /programming/3208258/memoization-in-haskell . Sfortunatamente, la memoizzazione in realtà rende il calcolo del ciclo (n) ancora più lento. Credo che il rallentamento provenga dal sovraccarico della via di Haskell. (Ho provato a correre con il codice binario compilato, invece di interpretare.)
Ho anche il sospetto che il semplice iterare i numeri da i a j possa essere costoso ($ i, j \ le10 ^ 6 $). Quindi ho anche provato a pre-calcolare tutto per la query di intervallo, usando l'idea di http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Tuttavia, ciò continua a generare l'errore "Superamento del limite di tempo".
Potete aiutarmi a informare un accurato programma competitivo Haskell per questo?