मैं हास्केल में गतिशील प्रोग्रामिंग के साथ खेल रहा हूं। इस विषय पर मैंने जो व्यावहारिक रूप से देखा है, वही, बहुत ही सुरुचिपूर्ण एल्गोरिदम देता है जो ज्ञापन और आरे प्रकार की आलस्य पर आधारित होता है। उन उदाहरणों से प्रेरित, मैंने निम्नलिखित एल्गोरिदम को एक परीक्षण के रूप में लिखा:हास्केल में कुशल डायनामिक प्रोग्रामिंग एल्गोरिदम कैसे लिखता है?
-- pascal n returns the nth entry on the main diagonal of pascal's triangle
-- (mod a million for efficiency)
pascal :: Int -> Int
pascal n = p ! (n,n) where
p = listArray ((0,0),(n,n)) [f (i,j) | i <- [0 .. n], j <- [0 .. n]]
f :: (Int,Int) -> Int
f (_,0) = 1
f (0,_) = 1
f (i,j) = (p ! (i, j-1) + p ! (i-1, j)) `mod` 1000000
मेरी एकमात्र समस्या दक्षता है। यहां तक कि जीएचसी के-ओ 2 का उपयोग करके, इस कार्यक्रम को pascal 1000
की गणना करने के लिए 1.6 सेकंड लगते हैं, जो समकक्ष अपरिवर्तित सी ++ प्रोग्राम की तुलना में 160 गुना धीमी है। और अंतर केवल बड़े इनपुट के साथ बढ़ता है।
ऐसा लगता है कि मैंने उपरोक्त कोड के हर संभव क्रमपरिवर्तन की कोशिश की है, साथ ही डेटा-मेमोकॉम्बिनेटर लाइब्रेरी जैसे सुझाए गए विकल्पों के साथ, और उन सभी के समान या खराब प्रदर्शन था। एक चीज जिसने मैंने कोशिश नहीं की है वह एसटी मोनाड है, जो मुझे यकीन है कि कार्यक्रम को चलाने के लिए केवल सी संस्करण की तुलना में धीमी गति से धीमा हो सकता है। लेकिन मैं वास्तव में इसे बेवकूफ हास्केल में लिखना चाहता हूं, और मुझे समझ में नहीं आता कि मूर्खतापूर्ण संस्करण इतना अक्षम क्यों है। मेरे पास दो प्रश्न हैं:
उपरोक्त कोड इतना अक्षम क्यों है? यह प्रत्येक प्रविष्टि पर अंकगणितीय ऑपरेशन के साथ, एक मैट्रिक्स के माध्यम से एक सीधा पुनरावृत्ति की तरह लगता है। जाहिर है हास्केल उन दृश्यों के पीछे कुछ कर रहा है जिन्हें मैं समझ नहीं पा रहा हूं।
क्या इसके स्टेटलेस, रिकर्सिव फॉर्मूलेशन को बलि किए बिना इसे अधिक कुशल बनाने के लिए कोई अधिक कुशल (एक सी प्रोग्राम के रनटाइम पर 10-15 बार) बनाने का कोई तरीका है (एसटी में परिवर्तनीय सरणी का उपयोग करके कार्यान्वयन के साथ-साथ इकाई)?
बहुत बहुत धन्यवाद।
संपादित करें: सारणी का प्रयोग किया मॉड्यूल मानक Data.Array
उपयोग 'rem' बजाय' mod' – is7s
कौन सा सरणी मॉड्यूल: बेशक, के रूप में मुझे यकीन है कि आप जानते हैं कि कर रहा हूँ, वे दोनों पानी (
0.00s
) से बाहर संस्करण एक बेहतर एल्गोरिथ्म का उपयोग करता है के द्वारा उड़ा हो आप उपयोग कर रहे? – is7sप्रदर्शन की तुलना कैसे करती है यदि आप "एफ (i, j) = (f (i, j-1) + f (i-1, j))" (और पूरी तरह से डुबकी पी) का उपयोग करते हैं? मुझे समझ में नहीं आता कि पी के माध्यम से कैसे जा रहा है, हालांकि मैं मानता हूं कि मैं हास्केल के साथ बहुत अनुभवी नहीं हूं। – DGH