นี่เป็นปัญหาที่การเขียนโปรแกรมอย่างง่ายจาก Spoj: http://www.spoj.com/problems/PROBTRES/
โดยพื้นฐานแล้วคุณจะถูกขอให้แสดงรอบวัฏจักร Collatz ที่ใหญ่ที่สุดสำหรับตัวเลขระหว่าง i และ j (รอบ Collatz ของจำนวน $ n $ คือจำนวนขั้นตอนที่จะได้รับจาก $ n $ ถึง 1 ในที่สุด)
ฉันได้มองหาวิธี Haskell เพื่อแก้ปัญหาด้วยประสิทธิภาพเปรียบเทียบมากกว่าของ Java หรือ C ++ (เพื่อให้พอดีกับขีด จำกัด เวลาทำงานที่อนุญาต) แม้ว่าโซลูชัน Java อย่างง่ายที่จดจำความยาวของรอบของรอบใด ๆ ที่คำนวณแล้วจะใช้งานได้ แต่ฉันไม่ประสบความสำเร็จในการนำแนวคิดนี้ไปใช้เพื่อรับโซลูชัน Haskell
ฉันได้พยายาม Data.Function.Memoize เช่นเดียวกับเทคนิค memoization ที่่กลั่นในบ้านเวลาเข้าสู่ระบบโดยใช้ความคิดจากการโพสต์นี้: /programming/3208258/memoization-in-haskell น่าเสียดายที่การบันทึกช่วยจำทำให้การคำนวณรอบ (n) ช้าลง ฉันเชื่อว่าช้าลงมาจากค่าใช้จ่ายของทาง Haskell (ฉันพยายามเรียกใช้ด้วยรหัสไบนารีที่คอมไพล์แล้วแทนการตีความ)
ฉันยังสงสัยด้วยว่าการวนซ้ำตัวเลขจาก i ถึง j นั้นอาจมีค่าใช้จ่ายสูง ($ i, j \ le10 ^ 6 $) ดังนั้นผมจึงพยายามทุกอย่างแม้กระทั่ง precompute สำหรับการค้นหาช่วงที่ใช้ความคิดจากhttp://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html อย่างไรก็ตามยังคงมีข้อผิดพลาด "เกินขีด จำกัด เวลา"
คุณสามารถช่วยแจ้งโปรแกรม Haskell ที่มีการแข่งขันสูงได้หรือไม่?