कौन से एल्गोरिदम / डेटा संरचनाएं मुझे नाम से "पहचान" और जानना चाहिए? [बन्द है]


69

मैं अपने आप को एक काफी अनुभवी प्रोग्रामर मानना ​​चाहता हूँ। अब मैं 5 वर्षों से प्रोग्रामिंग कर रहा हूं। मेरी कमजोर बात हालांकि शब्दावली है। मैं स्व-सिखाया गया हूं, इसलिए जब मैं कार्यक्रम करना जानता हूं, तो मुझे कंप्यूटर विज्ञान के कुछ अधिक औपचारिक पहलुओं का पता नहीं है। तो, व्यावहारिक एल्गोरिदम / डेटा संरचनाएं क्या हैं जिन्हें मैं नाम से पहचान और जान सकता हूं?

ध्यान दें, मैं एल्गोरिदम को लागू करने के बारे में एक पुस्तक सिफारिश के लिए नहीं कह रहा हूं। मैं उन्हें लागू करने के बारे में परवाह नहीं करता हूं, मैं बस यह पहचानना चाहता हूं कि एक एल्गोरिथ्म / डेटा संरचना एक समस्या का एक अच्छा समाधान कब होगा। मैं एल्गोरिदम / डेटा संरचनाओं की एक सूची के लिए अधिक पूछ रहा हूं जिन्हें मुझे "पहचानना" चाहिए। उदाहरण के लिए, मैं इस तरह की समस्या का हल जानता हूं:

आप 0-999 लेबल वाले लॉकर्स के एक सेट का प्रबंधन करते हैं। लोग आपके पास लॉकर किराए पर लेने के लिए आते हैं और फिर लॉकर की चाबी वापस करने के लिए आते हैं। आप यह जानने के लिए सॉफ्टवेयर के एक टुकड़े का निर्माण कैसे करेंगे कि कौन से लॉकर मुफ्त हैं और कौन से उपयोग में हैं?

समाधान, एक कतार या ढेर होगा।

मैं ऐसी चीजों की तलाश कर रहा हूं जैसे "किस स्थिति में बी-ट्री का उपयोग किया जाना चाहिए - यहां किस एल्गोरिथ्म का उपयोग किया जाना चाहिए" आदि और हो सकता है कि अधिक जटिल (लेकिन आमतौर पर उपयोग किए जाने वाले) डेटा संरचनाओं का एक त्वरित परिचय / एल्गोरिदम काम करते हैं।

मैंने विकिपीडिया की डेटा संरचनाओं और एल्गोरिदम की सूची को देखने की कोशिश की, लेकिन मुझे लगता है कि यह थोड़ा अधिक है। इसलिए मैं उन चीजों की तलाश कर रहा हूं जो मुझे पहचाननी चाहिए?


10
"रचनात्मक नहीं" के रूप में बंद करने के लिए मतदान। कोई भी उत्तर पूरी तरह से व्यक्तिपरक होगा - इस बात पर कोई सहमति नहीं है कि किसी को "क्या" जानना चाहिए।
ऊल जूल

2
उस लॉकर समस्या के किस भाग में इनपुट / आउटपुट ऑर्डरिंग की आवश्यकता होती है? [संकेत!]
तेलास्तीन

5
@ पूरी तरह से एक सूची है जो मुझे लगता है कि ज्यादातर लोग इस बात पर सहमत होंगे कि डेटा संरचनाओं और एल्गोरिदम को एक अच्छी तरह से वाकिफ प्रोग्रामर को पता होना चाहिए।
डेविड काउडन

6
@ कोई सहमति नहीं? कंप्यूटर विज्ञान में एल्गोरिदम और डेटा संरचनाओं पर एक परिचयात्मक पाठ्यक्रम के पाठ्यक्रम के बारे में क्या? काफी अच्छी तरह से मानकीकृत और सहकर्मी की समीक्षा की । एक अच्छा शुरुआती बिंदु।
मार्क

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

जवाबों:


78

एक उद्देश्य प्रतिक्रिया:

जबकि इस सवाल पर मेरी प्रारंभिक प्रतिक्रिया एक जल्द ही स्नातक होने वाले सीएस छात्र के रूप में मेरे अनुभवजन्य अनुभव पर आधारित थी और सीएस क्षेत्र में काम करने के इच्छुक लोगों के बारे में मेरी अनुमानित राय थी। वास्तव में एक उद्देश्य है (ACM SIGCSE और IEEE कंप्यूटिंग सोसाइटी के व्यक्तिपरक राय के संबंध में) उत्तर। हर 10 साल में ACM और IEEE निकाय एक संयुक्त प्रकाशन पर सहयोग करते हैं , जो कंप्यूटिंग उद्योग की स्थिति के पेशेवर ज्ञान के आधार पर स्नातक कंप्यूटर विज्ञान पाठ्यक्रम के सुझावों का विवरण देता है। अधिक जानकारी cs2013.org पर देखी जा सकती है । समिति अपने पाठ्यक्रम की सिफारिश को सूचीबद्ध करने वाली एक अंतिम रिपोर्ट प्रकाशित करती है ।

उस ने कहा, मुझे अभी भी लगता है कि मेरी सूची बहुत अच्छी है।

नीचे मूल उत्तर।


मुझे क्या पता होना चाहिए

न्यूनतम

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

शीर्षक प्रश्न का उत्तर देने के लिए, यहां स्नातक छात्र (एक निपुण प्रोग्रामर के लिए नींव) को स्नातक होने पर पता होना चाहिए:

डेटा संरचनाएं

  • मशीन डेटा प्रतिनिधित्व
    • ओन्स, टू का कॉम्प्लिमेंट और संबंधित अंकगणित
    • शब्द, पॉइंटर्स, फ़्लोटिंग पॉइंट
    • बिट एक्सेस, शिफ्टिंग और मैनीपुलेशन
  • लिंक की गई सूची
  • हैश टेबल्स (नक्शे या शब्दकोश)
  • Arrays
  • पेड़
  • ढेर
  • कतार
  • रेखांकन
  • डेटाबेस

एल्गोरिदम

  • क्रमबद्ध करना:
    • बबल सॉर्ट (यह जानने के लिए कि यह खराब क्यों है)
    • सम्मिलन सॉर्ट
    • मर्ज़ सॉर्ट
    • जल्दी से सुलझाएं
    • मूलांक शैली प्रकार, गिनती क्रमबद्ध और बाल्टी क्रमबद्ध
    • ढेर बनाएं और छांटें
    • बोगो और क्वांटम सॉर्ट (=)
  • खोज कर:
    • रैखिक खोज
    • द्विआधारी खोज
    • गहराई पहली खोज
    • पहले चौड़ाई खोजो
  • स्ट्रिंग मैनिपुलेशन
  • यात्रा
  • पेड़ का फंदा
  • सूची ट्रैवर्सल
  • हैशिंग फंक्शंस
  • एक हैश टेबल, ट्री, सूची, ढेर, कतार, सरणी और सेट या संग्रह का ठोस कार्यान्वयन
  • शेड्यूलिंग एल्गोरिदम
  • फ़ाइल सिस्टम ट्रैवर्सल और मैनीपुलेशन ( इनोड या समकक्ष स्तर पर)।

डिजाइन पैटर्न्स

  • modularization
  • फ़ैक्टरी
  • निर्माता
  • एकाकी वस्तु
  • अनुकूलक
  • डेकोरेटर
  • फ्लाईवेट
  • देखने वाला
  • इटरेटर
  • राज्य मशीन]
  • मॉडल दृश्य नियंत्रक
  • थ्रेडिंग और समानांतर प्रोग्रामिंग पैटर्न

उदाहरण

  • अनिवार्य
  • वस्तु के उन्मुख
  • कार्यात्मक
  • कथात्मक
  • स्थिर और गतिशील प्रोग्रामिंग
  • डेटा मार्कअप

जटिलता सिद्धांत

  • जटिलता रिक्त स्थान
  • कम्प्यूटेबिलिटी
  • नियमित, संदर्भ मुक्त, और यूनिवर्सल ट्यूरिंग मशीन पूरी भाषाएँ
  • नियमित अभिव्यक्ति
  • काउंटिंग और बेसिक कॉम्बिनेटरिक्स

परे

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

यहाँ एल्गोरिदम और डेटा संरचनाओं के लिए कुछ सुझाव दिए गए हैं:

  • बाइनरी खोज केवल (और चाहिए) का उपयोग सॉर्ट किए गए डेटा पर किया जाना चाहिए।
  • मूलांक शैली के प्रकार भयानक हैं, लेकिन केवल तब जब आपके पास चीजों की बारीक कक्षाएं होती हैं।
  • पेड़ लगभग किसी भी चीज के लिए अच्छे हैं क्योंकि हैश टेबल हैं। एक हैश टेबल की कार्यक्षमता को अतिरिक्त रूप से बढ़ाया जा सकता है और दक्षता की कीमत पर कई समस्याओं को हल करने के लिए उपयोग किया जाता है।
  • Arrays का उपयोग सबसे उच्च स्तरीय डेटा संरचनाओं को वापस करने के लिए किया जा सकता है। कभी-कभी "डेटा संरचना" किसी सरणी में स्थानों तक पहुंचने के लिए कुछ चतुर गणित से अधिक नहीं होती है।
  • भाषा का चुनाव आपके बालों को ऊपर खींचने, या एक समस्या के माध्यम से नौकायन करने के बीच का अंतर हो सकता है।
  • ASCII तालिका और 128 तत्व सरणी एक अंतर्निहित हैश तालिका (=) बनाते हैं
  • नियमित अभिव्यक्ति बहुत सारी समस्याओं को हल कर सकती है, लेकिन उन्हें HTML को पार्स करने के लिए उपयोग नहीं किया जा सकता है
  • कभी-कभी डेटा संरचना एल्गोरिथ्म की तरह ही महत्वपूर्ण है।

उपरोक्त में से कुछ बिना ब्रेनर की तरह लग सकते हैं, और कुछ अस्पष्ट लग सकते हैं। यदि आप चाहते हैं कि मैं और अधिक विस्तार से जाऊं, तो मैं कर सकता हूं। लेकिन, मेरी आशा है कि जब एक और अधिक ठोस प्रश्न का सामना करना पड़े, जैसे कि, "एक ऐसा फंक्शन डिज़ाइन करें जो एक स्ट्रिंग में प्रत्येक वर्ण की घटनाओं की संख्या को गिनता है", तो आप ASCII तालिका के बारे में टिप को देखते हैं और 128 तत्व सरणियों को स्वच्छ निहित बनाते हैं। जवाब के लिए तालिकाओं।

इन विचारों के आधार पर, मैं आपके प्रश्न में उल्लिखित लॉकर समस्या का उत्तर दूंगा।


आपके प्रश्न में प्रस्तुत समस्या का उत्तर।

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

आपके पास 0-999 लॉकर हैं। अब, क्योंकि आपके पास निश्चित संख्या में लॉकर हैं, आप 0-999 की रेंज में बिना किसी टक्कर के एक हैशिंग फ़ंक्शन को आसानी से देख सकते हैं। यह फ़ंक्शन बस h (x) = x mod 1000 है। अब, [वैचारिक रूप से] पूर्णांक कुंजियों के साथ एक हैश तालिका और आपके मूल्यों के रूप में एक 1000 तत्व चार सरणी की सामग्री का निर्माण करें। अगर कोई ग्राहक उपयोग के लिए लॉकर 78 आरक्षित करना चाहता है, तो बस 78 को हैश फ़ंक्शन में रखें (78 लौटाते हुए), और फिर उस नंबर को सरणी के आधार पॉइंटर में जोड़ें - ऑफसेट मूल्य द्वारा बताए गए स्थान पर एक सही मान संग्रहीत करना । इसी तरह, अगर आपको यह जांचने की आवश्यकता है कि क्या 78 उपयोग में है, तो बस उस स्थान पर संग्रहीत मान पढ़ें और सत्य के खिलाफ जांचें

यह समाधान एक लॉग (n) टाइम स्टोरेज और एक बाइनरी ट्री द्वारा समर्थित प्राथमिकता कतार के मामले में लुकअप के विपरीत लुकअप और स्टोरेज के लिए निरंतर समय में संचालित होता है। वर्णन जानबूझकर किया जाता है ताकि आप उच्च अवधारणाओं को एक कुशल एल्गोरिथ्म में उबला हुआ देख सकें।

अब, आप पूछ सकते हैं, क्या होगा अगर मुझे सभी उपलब्ध लॉकरों को जानना होगा, तो प्राथमिकता कतार बेहतर नहीं होगी? यदि प्राथमिकता कतार में k उपलब्ध लॉकर हैं, तो उन सभी पर पुनरावृति के लिए कदम उठाएंगे। इसके अलावा, आपकी प्राथमिकता कतार कार्यान्वयन के आधार पर, आपको अपनी प्राथमिकता कतार का पुनर्निर्माण करना पड़ सकता है क्योंकि आप यह सब देखते हैं .. जो k * log (k): (k <1000) कदम उठाएगा। एरे सॉल्यूशन में, आपको केवल 1000 एलिमेंट एरे की पुनरावृति करनी होगी और यह देखना होगा कि कौन सी खुली हैं। आप केवल समय में जाँच करने के लिए कार्यान्वयन के लिए एक उपलब्ध या उपयोग की गई सूची को भी जोड़ सकते हैं।


1
बहुत बढ़िया जवाब! मैं यह भी जोड़ना चाहूंगा, कि आप वास्तव में उस भाषा के पूर्वनिर्धारित कार्यों / डेटास्ट्रक्चर का उपयोग करने में आश्वस्त होना चाहिए, उदाहरण के लिए C ++ में एल्गोरिथ्म और स्टाल डेटा संरचनाओं, या जावा के लिए जावा एपीआई।
मार्कटनी

1
अति उत्कृष्ट! विशेष रूप से "नियमित अभिव्यक्ति बहुत सारी समस्याओं को हल कर सकती है, लेकिन उन्हें HTML को पार्स करने के लिए उपयोग नहीं किया जा सकता है।"
FrustratedWithFormsDesigner

2
जवाब अच्छा था, जब तक "समस्या" दिखाई नहीं दी। प्राथमिकता कतार या हैश-टेबल का उपयोग करने का कोई कारण नहीं है। एक साधारण स्टैक पर्याप्त है। यदि आप चाहें तो मुफ्त लॉकर की पूरी सूची प्राप्त करने के लिए पुनरावृत्ति जोड़ें।
Matthieu M.

1
क्या हमें संबंधपरक डेटाबेस + एसक्यूएल, बी + ट्री, कंपाइलर सिद्धांत, ज्ञान हार्डवेयर संगठन, ऑपरेशन सिस्टम सिद्धांत का ज्ञान, टीसीपी / आईपी नेटवर्किंग का ज्ञान जोड़ना चाहिए?
dan_l

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

6

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


3
महान पुस्तक है, लेकिन आपको नहीं लगता कि आपको वास्तव में एक प्रोग्रामर बनने के लिए यह सब करना होगा। मैंने अभी हाल ही में इसे खरीदा है, और मुझे 1979 से कार्यक्रम के लिए भुगतान किया गया है। (और हाँ, मैंने यह विश्वास किया कि मैं इससे कुछ सीख सकता हूँ।)
केट ग्रेगोरी

@ केटग्रेगरी मैंने किताब खरीदी और वास्तव में इसे लटका नहीं पाया क्योंकि मैं केवल उच्च स्तर की भाषाएँ जानता हूँ जैसे रूबी और जावास्क्रिप्ट (कोई बाइनरी ट्री, लिस्टेड लिस्ट इत्यादि नहीं) ... मैंने अंततः इसे पढ़ना छोड़ दिया।
मई को बड़ा आलू

4

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

फिर सार है लेकिन बेहद उपयोगी सामान (हालांकि उपयोगिता तुरंत स्पष्ट नहीं है): राज्य मशीनें, ग्राफ सिद्धांत, उत्तलता सिद्धांत (रैखिक प्रोग्रामिंग, आदि)।


1
कब क्या उपयोग करना है, इसके बारे में जानने के महत्व को कम मत समझो। क्योंकि जिन समस्याओं को आपने एक साधारण सरणी का उपयोग करके हल किया था, वे वापस आएँगी और आपको काटेंगी जब आप उस बड़े ग्राहक को रील करने वाले हों और आपके एप्लिकेशन को पता चले कि जो सालों तक ठीक काम करता है, वह क्रॉल करने के लिए धीमा हो जाता है क्योंकि आपने इसके बजाय एक बुलबुले का उपयोग किया था एक तेज।
बी पर पीटर बी

3

एमआईटी परिचय के लिए मुफ्त व्याख्यान नोट्स, वीडियो, असाइनमेंट और परीक्षा सामग्री प्रकाशित करता है । व्याख्यान खिताब सूची एल्गोरिदम / डेटा को कवर किया संरचनाओं।

यह एक सहकर्मी की समीक्षा की गई सहमति है जिसे आपको जानना चाहिए। यह शायद एक महान शिक्षण संसाधन है।

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