कार्यात्मक प्रोग्रामिंग भाषा कार्यान्वयन पर एल्गोरिथम जटिलता विश्लेषण


10

मैंने आज सीखा कि एल्गोरिथम विश्लेषण कम्प्यूटेशनल मॉडल के आधार पर भिन्न होता है। यह ऐसा कुछ है जिसके बारे में मैंने कभी नहीं सोचा या इसके बारे में नहीं सुना।

एक उदाहरण मुझे दिया गया है, जो कि उपयोगकर्ता @chi द्वारा इसे आगे चित्रित करता है :

जैसे कार्य पर विचार करें: दिया वापसी x i । रैम में इसे में हल किया जा सकता है क्योंकि सरणी पहुंच स्थिर-समय है। TM का उपयोग करते हुए, हमें पूरे इनपुट को स्कैन करने की आवश्यकता है, इसलिए यह(मैं,एक्स1,...,एक्सn)एक्समैंO ( n )हे(1)हे(n)

इससे मुझे कार्यात्मक भाषाओं के बारे में आश्चर्य होता है; मेरी समझ से, "कार्यात्मक भाषाएं लंबोदर कलन से संबंधित हैं" ( यहाँ पर युवल फिल्मस की एक टिप्पणी से )। इसलिए, यदि कार्यात्मक भाषाएं लैम्ब्डा कैलकुलस पर आधारित हैं, लेकिन वे रैम आधारित मशीनों पर चलते हैं, तो विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं और भाषाओं का उपयोग करके कार्यान्वित एल्गोरिदम पर जटिलता विश्लेषण करने का उचित तरीका क्या है?

मुझे विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं को पढ़ने का अवसर नहीं मिला है, लेकिन मैंने इस विषय के लिए विकिपीडिया पृष्ठ को देखा है, और ऐसा लगता है कि कुछ डेटा संरचनाएं पारंपरिक सरणियों को प्रतिस्थापित करती हैं:

"एरेज़ को मैप या रैंडम एक्सेस लिस्ट से बदला जा सकता है, जो विशुद्ध रूप से कार्यात्मक कार्यान्वयन को स्वीकार करता है, लेकिन एक्सेस और अपडेट का समय लॉगरिदमिक है।"

उस मामले में, कम्प्यूटेशनल मॉडल अलग, सही होगा?


3
मैं निश्चित रूप से इस विषय पर विशेषज्ञ नहीं हूं, लेकिन मेरा मानना ​​है कि मैंने सुना है कि 1) एक लिस्प जैसी मशीन (अपने स्वयं के लागत मॉडल के साथ) रैम कार्यक्रमों को अनुकरण कर सकती है हे(लॉगn)हे(लॉगn)n

1
हे(1)

1
एक अलग कम्प्यूटेशनल मॉडल का एक उदाहरण लैम्ब्डा कैलकुलस शब्द पर किए गए बीटा रिडक्शन की संख्या होगी। एफपी में हम अधिक एक लैंबडा कैलकुलस के रूप में तैयार राम मॉडल का उपयोग कर रहे हैं, अगर यह समझ में आता है
कर्ट म्यूलर

1
@KurtMueller ध्यान दें कि हम आकार का एक लंबोदर शब्द प्राप्त कर सकते हैं हे(2n)हे(n)

1
ध्यान दें कि आपको यह जानना भी आवश्यक है कि आपकी कार्यात्मक भाषा उत्सुक है या आलसी / सख्त या गैर-सख्त। मुझे हाल ही में एक ऐसी स्थिति का सामना करना पड़ा जहां हास्केल (गैर-सख्त) में एक वास्तविक-विश्व एल्गोरिथ्म बहुपद था, लेकिन OCaml (सख्त) के लिए भोली अनुवाद घातीय था।
एरिक लिपर्ट

जवाबों:


6

यह आपकी कार्यात्मक भाषा के शब्दार्थ पर निर्भर करता है। आप अलगाव भाषाओं में प्रोग्रामिंग भाषाओं पर एल्गोरिथ्म विश्लेषण नहीं कर सकते हैं, क्योंकि आपको नहीं पता कि बयानों का वास्तव में क्या मतलब है। आपकी भाषा के लिए विनिर्देश को पर्याप्त रूप से विस्तृत शब्दार्थ प्रदान करने की आवश्यकता है। यदि आपकी भाषा लैम्ब्डा कैलकुलस के संदर्भ में सब कुछ निर्दिष्ट करती है, तो आपको कटौती के लिए कुछ लागत माप की आवश्यकता होती है (क्या वे ओ (1) हैं या क्या वे आपके द्वारा कम किए गए शब्द के आकार पर निर्भर हैं?)।

मुझे लगता है कि अधिकांश कार्यात्मक भाषाएं ऐसा नहीं करती हैं और इसके बजाय अधिक उपयोगी कथन प्रदान करती हैं जैसे "फ़ंक्शन कॉल ओ (1) हैं, एक सूची के प्रमुख के लिए हे (1)" है, जैसी चीजें।


मेरा मानना ​​है कि मैं आपके उत्तर को समझता हूं (गलतफहमी सबसे अधिक संभावना है कि लैम्ब्डा कैलकुलस में मेरी समझ की कमी के कारण): आप कह रहे हैं कि आपको मूल रूप से मामले (केस लैंग्वेज) के आधार पर मामले के बजाय विश्लेषण करना होगा। सामान्य तरीका, क्योंकि कुछ कार्यों के प्रति भाषा के अलग-अलग अर्थ होते हैं। क्या मेरी समझ सही है?
अब्दुल

हाँ। आपके भाषा डिज़ाइनर को यह बताने की आवश्यकता है कि भाषा में लिखी जाने वाली चीज़ों का वास्तव में क्या मतलब हो सकता है इससे पहले कि आप एक एल्गोरिथ्म के रनटाइम का विश्लेषण कर सकें।
adrianN

"आप अलगाव में प्रोग्रामिंग भाषाओं पर एल्गोरिथ्म विश्लेषण नहीं कर सकते हैं" - यह सामान्य रूप से एफपी भाषाओं या भाषाओं का जिक्र था? यदि यह पहले की बात कर रहा था, तो हम स्कूल में इस तरह के सामान्य तरीके से विश्लेषण कैसे करते हैं यानी जावा, सी / सी ++, पायथन समस्याओं का विश्लेषण करते हैं? क्या यह इसलिए है क्योंकि वे सभी बहुत समान हैं? या यह इसलिए है क्योंकि अंतर्निहित डेटा संरचनाएं और ADT सभी समान हैं और एक ही तरीके से लागू होते हैं? या अंत में, क्या यह इसलिए है क्योंकि ये पाठ्यक्रम केवल शिक्षा के लिए हैं, और जरूरी नहीं कि सख्ती से सटीक हो?
अब्दुल

1
यह सभी प्रोग्रामिंग भाषाओं के लिए सही है। कड़ाई से सही होने के लिए आपको सबसे पहले एक मशीन मॉडल को ठीक करने की आवश्यकता है, रैम और (एक छोटा मुट्ठी भर) निर्देशों का समर्थन करें। आप केवल उन्हीं निर्देशों का उपयोग करके कार्यक्रमों पर विश्लेषण कर सकते हैं। तब आप अपनी प्रोग्रामिंग लैंग्वेज की मैपिंग के बारे में उस मशीन मॉडल से सोच सकते हैं। फिर आप प्रोग्रामिंग भाषा में कार्यक्रमों का विश्लेषण कर सकते हैं। बहुत कठोर उपचार के लिए, द आर्ट ऑफ़ कंप्यूटर प्रोग्रामिंग में नथ कैसे करता है। बड़े-ओ छिपने वाले स्थिरांक के कारण इसका बहुत कुछ सरल किया जा सकता है।
adrianN
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.