यहाँ SPOJ से एक सरल प्रोग्रामिंग समस्या है: http://www.spoj.com/problems/PROBTRES/ ।
मूल रूप से, आपको i और j के बीच की संख्या के लिए सबसे बड़े Collatz चक्र का उत्पादन करने के लिए कहा जाता है। (संख्या $ n $ का Collatz चक्र अंततः $ n $ 1. से $ पाने के लिए चरणों की संख्या है।)
मैं जावा या C ++ की तुलना में तुलनात्मक प्रदर्शन के साथ समस्या को हल करने के लिए एक हास्केल तरीके की तलाश कर रहा हूं (इसलिए अनुमत रन-टाइम सीमा में फिट होने के लिए)। यद्यपि एक सरल जावा समाधान जो किसी भी पहले से गणना किए गए चक्र की चक्र लंबाई को याद करता है वह काम करेगा, मैं हास्केल समाधान प्राप्त करने के लिए विचार को लागू करने में सफल नहीं रहा।
मैंने इस पोस्ट से आईडिया का उपयोग करके Data.Function.Memoize और साथ ही होम-ब्रूएड लॉग टाइम मेमोलाइजेशन तकनीक की कोशिश की है: /programming/3208258/memoization-in-haskell । दुर्भाग्य से, संस्मरण वास्तव में चक्र (एन) की गणना को भी धीमा बनाता है। मेरा मानना है कि धीमी गति हस्केल मार्ग के ऊपरी हिस्से से आती है। (मैंने व्याख्या करने के बजाय संकलित बाइनरी कोड के साथ चलने की कोशिश की।)
मुझे यह भी संदेह है कि केवल i से j तक संख्याओं को पुनरावृत्त करना महंगा हो सकता है ($ i, j \ le10 ^ 6 $)। इसलिए मैंने भी http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html से विचार का उपयोग करते हुए, रेंज क्वेरी के लिए सब कुछ करने की कोशिश की । हालाँकि, यह अभी भी "समय सीमा से अधिक" त्रुटि देता है।
क्या आप इसके लिए एक स्वच्छ प्रतियोगी हास्केल कार्यक्रम को सूचित करने में मदद कर सकते हैं?