2010-04-09 15 views
6

एल्गोरिदम कक्षा का विषय आज डेटा संरचनाओं को पुन: कार्यान्वित कर रहा था, विशेष रूप से जावा में ऐरेलिस्ट। तथ्य यह है कि आप विभिन्न तरीकों से संरचना को कस्टमाइज़ कर सकते हैं, विशेष रूप से मुझे दिलचस्पी मिलती है, विशेष रूप से जोड़ने की विविधताओं() & iterator.remove() विधियों के साथ।वास्तविक दुनिया में डेटा संरचनाओं को पुन: कार्यान्वित करना

लेकिन क्या डेटा संरचना को पुन: कार्यान्वित और अनुकूलित करना कुछ ऐसा है जो अकादमिक बनाम वास्तविक दुनिया प्रोग्रामर बनाम है? क्या किसी ने वाणिज्यिक अनुप्रयोग/कार्यक्रम में डेटा संरचना के अपने संस्करण को फिर से कार्यान्वित किया है, और आपने अपनी विशेष भाषा के कार्यान्वयन पर उस मार्ग को क्यों चुना?

उत्तर

4

यह जानना कि डेटा संरचनाओं को कैसे कार्यान्वित किया जाता है और कार्यान्वित किया जा सकता है, निश्चित रूप से केवल शिक्षाविदों के लिए ही सभी के लिए ब्याज की बात नहीं है। हालांकि, यदि आप भाषा पहले से ही उपयुक्त कार्यों और प्रदर्शन विशेषताओं के साथ कार्यान्वयन प्रदान करते हैं, तो यह संभवतः एक डेटास्ट्रक्चर को फिर से लागू नहीं करेगा, यह बहुत संभव है कि आपको अन्य डेटा संरचनाओं को लिखकर अपनी खुद की डेटा संरचना बनाना होगा ... या आपको इसकी आवश्यकता हो सकती है एक अच्छी तरह से ज्ञात डेटा संरचना की तुलना में थोड़ा अलग व्यवहार के साथ एक डेटा संरचना लागू करें। उस स्थिति में, आपको निश्चित रूप से यह जानने की आवश्यकता होगी कि मूल डेटा संरचना कैसे कार्यान्वित की जाती है। वैकल्पिक रूप से, आप एक डेटा संरचना की आवश्यकता समाप्त कर सकते हैं जो मौजूद नहीं है या जो मौजूदा डेटा संरचना के समान व्यवहार प्रदान करता है, लेकिन जिस तरीके से इसका उपयोग किया जाता है, उसे यह आवश्यक है कि इसे विभिन्न कार्यों के सेट के लिए अनुकूलित किया जाए। फिर, ऐसी स्थिति के लिए आपको डेटा संरचना को कार्यान्वित करने (और बदलने) की आवश्यकता होगी, इसलिए हां यह ब्याज की बात है।

संपादित
मैं की वकालत नहीं कर कि आप मौजूदा datastructures reimplement हूँ! ऐसा मत करो। मैं जो कह रहा हूं वह है कि ज्ञान में व्यावहारिक अनुप्रयोग है। उदाहरण के लिए, आपको एक द्विदिशीय मानचित्र डेटा संरचना (जिसे आप दो यूनिडायरेक्शनल मैप डेटा स्ट्रक्चर लिखकर कार्यान्वित कर सकते हैं) बनाने की आवश्यकता हो सकती है, या आपको एक स्टैक बनाने की आवश्यकता हो सकती है जो विभिन्न आंकड़ों (जैसे न्यूनतम, अधिकतम, मतलब) एक मौजूदा स्टैक डेटा संरचना का उपयोग करके तत्व प्रकार के साथ जिसमें मूल्य और साथ ही इन विभिन्न आंकड़े शामिल हैं। ये उन चीजों के कुछ छोटे उदाहरण हैं जिन्हें आपको वास्तविक दुनिया में लागू करने की आवश्यकता हो सकती है।

+0

एक यात्रा विक्रेता के लिए एक अधिक कुशल समाधान प्राप्त करने के लिए LinkedList के add() और iterator.remove() के साथ ArrayList के यादृच्छिक उपयोग को जोड़ना जैसे? उदाहरण के लिए – Jason

+0

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

2

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

उदाहरण के लिए, एक सिस्टम जिस पर मैंने काम किया था, एक एमआईपीएस सीपीयू का इस्तेमाल किया जो 32-बिट संख्याओं के साथ काम करते समय तेज़ था लेकिन छोटे लोगों के साथ काम करते समय धीमा था। मैंने 16-बिट पूर्णांक के बजाय 32-बिट पूर्णांक का उपयोग करने के लिए कई डेटा संरचनाओं और कार्यों को फिर से लिखा, और यह भी निर्दिष्ट किया कि फ़ील्ड 32-बिट सीमाओं के साथ गठबंधन किए जाएंगे। नतीजा कोड के एक खंड में एक उल्लेखनीय गति वृद्धि था जो सॉफ़्टवेयर के अन्य हिस्सों को बाधित कर रहा था।

कहा जा रहा है कि यह एक छोटी सी प्रक्रिया नहीं थी। मैं उस संरचना का उपयोग करने वाले हर समारोह को संशोधित करने के लिए समाप्त हुआ और मैंने कई मानक लाइब्रेरी कार्यों को फिर से लिखना शुरू कर दिया। इस विशेष उदाहरण में, लाभ ने काम से अधिक लाभ उठाया। सामान्य मामले में, हालांकि, यह आमतौर पर परेशानी के लायक नहीं है। हार्ड-टू-डीबग समस्याओं के लिए एक बड़ी संभावना है, और ऐसा लगता है कि यह लगभग हमेशा अधिक काम करता है। जब तक आपके पास विशिष्ट संरचनाएं या प्रतिबंध नहीं हैं जो मौजूदा संरचनाएं/कक्षाएं पूरी नहीं करती हैं, तो मैं उन्हें पुनः लागू करने के खिलाफ अनुशंसा करता हूं।

जैसा कि माइकल का उल्लेख है, को संरचनाओं को फिर से कार्यान्वित करने के लिए वास्तव में उपयोगी है, भले ही आप ऐसा न करें। आपको भविष्य में एक समस्या मिल सकती है जिसे मौजूदा डेटा संरचनाओं में उपयोग किए गए सिद्धांतों और तकनीकों को लागू करके हल किया जा सकता है।

संबंधित मुद्दे