डायनेमिक प्रोग्रामिंग जादू नहीं है
- डायनेमिक प्रोग्रामिंग एक ऐसी तकनीक है जिसका उपयोग जटिल समस्याओं को हल करने के लिए किया जाता है, जिसमें उन्हें छोटी समस्याओं में बाँटकर हल किया जाता है।
- यह तकनीक स्वाभाविक है, और कई सामान्य algorithms वास्तव में खास समस्याओं पर डायनेमिक प्रोग्रामिंग का ही अनुप्रयोग हैं।
- डायनेमिक प्रोग्रामिंग को समझने में मदद के लिए, यह एक आसान परिचय और विस्तृत व्याख्या प्रदान करता है।
शिकायत
- software engineering में naming अक्सर बहुत खराब होती है।
- 'bootstrap', 'daemon', 'cascading style sheets', 'cookie', 'artificial intelligence' जैसे शब्द अस्पष्ट या भ्रामक हो सकते हैं।
- 'डायनेमिक प्रोग्रामिंग' शब्द भी अपने आप में 'dynamic' से जुड़ा नहीं है; यह वास्तव में algorithm design में इस्तेमाल होने वाला एक विचार है।
बुनियादी caching
- जब आप किसी समस्या को छोटी समान समस्याओं में बाँटकर हल करने की कोशिश करते हैं, तो आपको वही छोटी समस्याएँ कई बार हल करनी पड़ सकती हैं।
- Fibonacci sequence के उदाहरण में, अगर इसे एक साधारण recursive function से लागू किया जाए, तो वही गणनाएँ बार-बार दोहराई जाती हैं।
- परिणामों को cache (या memoization) करके दोहराव वाली गणनाओं से बचा जा सकता है।
अनुकूलित caching
- memoization का उपयोग करने पर recursion बना रहता है, लेकिन जो चाहिए वही ज़रूरत पड़ने पर गणना की जाती है।
- इसके बजाय, आप जो कुछ भी चाहिए उसे पहले से गणना करने वाले तरीके से भी पहुँच सकते हैं।
- यह तरीका recursive calls के बिना समस्या हल करता है, और यही डायनेमिक प्रोग्रामिंग है।
edit distance
- दो strings के बीच edit distance वह न्यूनतम edits की संख्या है, जो एक string को दूसरी में बदलने के लिए चाहिए।
- edit distance को character replacement, insertion, और deletion शामिल करके निकाला जा सकता है, और इसे डायनेमिक प्रोग्रामिंग से कुशलतापूर्वक हल किया जा सकता है।
- आपको यह तरीका खोजना होता है कि छोटी समस्याओं के हल से पूरे समाधान तक कैसे पहुँचा जाए।
Advent of Code, Day 12
- 12 दिसंबर 2023 के Advent of Code प्रश्न में 1D nonogram को हल करना होता है।
- इसे brute force तरीके से हल किया जा सकता है, लेकिन इसकी complexity exponential होती है।
- इसके बजाय, डायनेमिक प्रोग्रामिंग लागू करके इसे कुशलतापूर्वक हल किया जा सकता है।
निष्कर्ष
- डायनेमिक प्रोग्रामिंग आसान नहीं है, लेकिन यह अधिकांश programmers की पहुँच से बाहर भी नहीं है।
- अगर आप समझ लें कि समस्या को छोटी समस्याओं में कैसे बाँटना है, तो आप कई स्थितियों में memoization का उपयोग कर सकते हैं, और यह naive implementation की तुलना में बड़ा सुधार होता है।
- डायनेमिक प्रोग्रामिंग में महारत हासिल करने से आप algorithms की एक पूरी class को समझ सकते हैं, trade-offs को बेहतर ढंग से समझ सकते हैं, और दूसरी optimizations को संभव बना सकते हैं।
GN⁺ की राय
- डायनेमिक प्रोग्रामिंग जटिल समस्याओं को कुशलतापूर्वक हल करने की एक महत्वपूर्ण तकनीक है, जो recursive approach की जगह छोटी समस्याओं के हल को cache करके दोहराव वाली गणनाओं को कम करती है और प्रदर्शन को काफी बेहतर बना सकती है।
- यह लेख उन शुरुआती software engineers के लिए बहुत उपयोगी है जो डायनेमिक प्रोग्रामिंग की बुनियादी अवधारणा को समझना चाहते हैं।
- Fibonacci sequence और edit distance के उदाहरण डायनेमिक प्रोग्रामिंग की अवधारणा समझने में मदद करते हैं और इसे वास्तविक समस्या-समाधान में लागू करने के लिए एक अच्छा शुरुआती बिंदु देते हैं।
1 टिप्पणियां
Hacker News राय
लेख में dynamic programming (DP) algorithm को recursion की caching के रूप में समझाना अच्छी बात है।
यह पसंद आया कि लेख पहले समस्या को recursive तरीके से संभालता है, फिर धीरे-धीरे caching जोड़ता है, और उसके बाद उसे ज़रूरी cache size तक घटाता है।
dynamic programming का एक शानदार application nucleic acid/protein sequence की pairwise alignment है।
एक बेहद शानदार algorithms professor के बारे में अनुभव साझा किया गया।
Dynamic Programming is not Black Magic नाम की पोस्ट का लिंक साझा किया गया।
जो लोग ज़्यादातर self-taught तरीके से programming सीखते हैं, उनके लिए नौकरी ढूँढते समय अगर interview में dynamic programming इस्तेमाल करने को कहा जाता, तो शायद वे नहीं जानते होते कि यह क्या है।
"dynamic programming" नाम ऐसा लग सकता है जैसे इसका संबंध programming field से हो।
यह सवाल उठाया गया कि "dynamic programming" सुनते ही सिर्फ़ "memoization" के बारे में सोचना क्या ग़लत है।
dynamic programming black magic नहीं है, लेकिन यह साबित करना कि किसी चीज़ को dynamic programming से हल किया जा सकता है और उसकी correctness को सिद्ध करना कठिन है।
dynamic programming में mastery पाने के लिए DPV algorithms book और Georgia Tech का Udacity course recommend किया गया।