सरणी के बिना संस्मरण


14

कॉर्मेन एट अल। एल्गोरिदम का परिचय , धारा 15.3 गतिशील प्रोग्रामिंग के तत्व निम्नलिखित के रूप में संस्मरण बताते हैं:

एक याद किया हुआ पुनरावर्ती एल्गोरिथ्म प्रत्येक सबप्रॉब्लम के समाधान के लिए एक तालिका में एक प्रविष्टि रखता है। प्रत्येक तालिका प्रविष्टि में शुरू में यह दर्शाने के लिए एक विशेष मान होता है कि प्रविष्टि अभी तक नहीं भरी गई है। जब उपप्रकार का पहली बार पुनरावृत्ति एल्गोरिथ्म के रूप में सामना किया जाता है, तो इसका समाधान गणना की जाती है और फिर तालिका में संग्रहीत किया जाता है। प्रत्येक बाद के समय में जब हम इस सबप्रॉब्लम का सामना करते हैं, तो हम केवल तालिका में संग्रहीत मान को देखते हैं और उसे वापस करते हैं।

और यह एक फुटनोट के रूप में जोड़ता है:

यह दृष्टिकोण बताता है कि हम सभी संभव उपप्रोमीटर मापदंडों के सेट को जानते हैं और हमने तालिका पदों और उपप्रकारों के बीच संबंध स्थापित किया है। एक और, अधिक सामान्य, दृष्टिकोण हैप्रोफाइल मापदंडों के साथ हैशिंग के साथ चाबियों के रूप में उपयोग करके याद रखना है।

क्या कोई अच्छी तरह से जानने वाली डीपी समस्याएं हैं जिन्हें (बहु आयामी) सरणी की बजाय किसी डिक्शनरी में ज्ञानात्मक मूल्यों को स्टोर करना (या आसान बनाना पड़ता है)?


पृष्ठभूमि: यदि यह किसी काम का है, तो इस प्रश्न का कारण यह है कि मैं उन लोगों को (स्वयं-संतुलित) द्विआधारी खोज पेड़ों की धारणा को प्रेरित करने की कोशिश कर रहा हूं, जिन्होंने अभी-अभी गतिशील प्रोग्रामिंग देखी है।


मैं जिस वास्तविक सॉफ़्टवेयर में काम करता हूं, उसे याद रखना इस तथ्य का उपयोग कर सकता है कि कोड में कई अलग-अलग जगहों से एक अपेक्षाकृत महंगा फ़ंक्शन (जैसे एक्सप , लॉग , या पॉव ) कहा जा सकता है, और अक्सर इसे क्रम में कई बार कहा जाता है प्रत्येक विशेष कोड स्थान से समान मूल्य। उस स्थिति में, "शब्दकोश" कोड-स्थान-विशिष्ट चर में संग्रहीत एक एकल मान हो सकता है।
माइक डनलैवी

जवाबों:


5

शायद बेहतर उदाहरण हैं, लेकिन यहाँ एक है, मेरे सिर के ऊपर से:

एस,टी>


3

मैं 2 उदाहरण प्रदान करना चाहूंगा।

0-1 नैकपैक समस्या

0-1 नॅप्सैक समस्या के मामले में (जहाँ डब्लू नॅप्सैक की क्षमता है और N , वस्तुओं की एक मात्रा है), कभी-कभी व्यवस्थित बॉटम-अप एन्हांसमेंट के बजाय, संस्मरण के साथ टॉप-डाउन डायनामिक प्रोग्रामिंग का उपयोग करना बेहतर होता है। सम्पूर्ण 2D सरणी का आकार WxN (विशेषकर ऐसी स्थिति में जब नैकपैक W की क्षमता बड़ी है, लेकिन आइटमों के भारों के अनुमत संयोजनों के सेट की कार्डिनैलिटी W से बहुत छोटी है )।

इस मामले में, एक स्मृति की अर्थव्यवस्था की खातिर, व्यक्ति 2 डी सरणी के बजाय संस्मरण के लिए शब्दकोश का उपयोग करना चुन सकता है।

ईयरली पार्सिंग एल्गोरिदम

अर्ली पार्सिंग एल्गोरिथ्म का उपयोग बयानों के पार्सिंग के लिए किया जा सकता है, जो एक संदर्भ-मुक्त व्याकरण से संबंधित हैं। CYK एल्गोरिथ्म के विपरीत (जो नीचे डीपी दृष्टिकोण पर आधारित है, और संस्मरण के लिए 2 डी तालिका का उपयोग करता है) - अर्ली पार्सर संस्मरण के लिए पार्सिंग चार्ट के साथ संयोजन में टॉप-डाउन दृष्टिकोण का उपयोग करता है ।

पार्सिंग चार्ट में आंशिक रूप से पार्स किए गए व्याकरणिक निर्माण होते हैं (उदाहरण: दिया गया उत्पादन X → AB , और इस उत्पादन के A भाग के सफल मिलान के बाद , हम पार्सिंग चार्ट के अंदर आंशिक रूप से मिलान किए गए उत्पादन को संग्रहीत करते हैं: X → • B , जहाँ डॉट अंक पहले से मिलान किए गए भाग)।

पार्सिंग चार्ट के अंदर कॉलम की मात्रा टोकन की मात्रा के बराबर है। हालांकि, सामान्य मामले में यह प्रति अंश आंशिक रूप से पार्स किए गए व्याकरणिक प्रस्तुतियों की मात्रा का अनुमान लगाने के लिए बहुत मुश्किल हो सकता है (यह व्याकरण और टोकन के विशेष अनुक्रम पर निर्भर करता है)।

इसलिए, शब्दकोश डेटा संरचना के आधार पर पार्सिंग चार्ट को लागू करना अधिक सुविधाजनक है।

नेचुरल लैंग्वेज प्रोसेसिंग डोमेन में, आमतौर पर ईयरली पार्सर अधिक सुविधाजनक विकल्प होता है, क्योंकि इसमें व्याकरण के लिए चॉम्स्की सामान्य रूप की आवश्यकता नहीं होती है (और CYK की ऐसी आवश्यकता होती है)।


0

प्रतिस्पर्धी प्रोग्रामिंग से मेरे अनुभव में, हैश टेबल (पायथन dictया समान) का उपयोग करना अक्सर एक सरणी का उपयोग करने की तुलना में अधिक सुविधाजनक होता है, क्योंकि किसी भी हैशीय डेटा प्रकार को कुंजी के रूप में उपयोग किया जा सकता है, जैसे कि स्ट्रिंग्स, सेट ( frozensetपायथन में) या ट्यूपर जैसे (string, int)। यदि आप किसी सरणी का उपयोग कर रहे हैं, तो आपको मैन्युअल रूप से सभी कुंजियों को पूर्णांक (0 से शुरू) में अनुवाद करना होगा, जो अतिरिक्त काम करता है और, यदि आपके स्रोत नोटों के रूप में, संभव नहीं है यदि आपको अग्रिम में कुंजियों का स्थान पता नहीं है। इसलिए शब्दकोश सरणियों की बजाय अधिक सामान्य हैं।

बेशक, यदि आप सरणियों का उपयोग करके दूर हो सकते हैं तो यह संभवत: तेज है क्योंकि यह बार-बार कंप्यूटिंग हैश से बचता है (दूसरी तरफ इसे पहले पूरे सरणी को शुरू करने की आवश्यकता होती है, जिसमें समय और मेमोरी लगती है), लेकिन कोड लिखने में अधिक समय लग सकता है क्योंकि आपको सभी कुंजियों को पूर्णांक में अनुवादित करने का अतिरिक्त कार्य करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.