एक उद्देश्य प्रतिक्रिया:
जबकि इस सवाल पर मेरी प्रारंभिक प्रतिक्रिया एक जल्द ही स्नातक होने वाले सीएस छात्र के रूप में मेरे अनुभवजन्य अनुभव पर आधारित थी और सीएस क्षेत्र में काम करने के इच्छुक लोगों के बारे में मेरी अनुमानित राय थी। वास्तव में एक उद्देश्य है (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 एलिमेंट एरे की पुनरावृति करनी होगी और यह देखना होगा कि कौन सी खुली हैं। आप केवल समय में जाँच करने के लिए कार्यान्वयन के लिए एक उपलब्ध या उपयोग की गई सूची को भी जोड़ सकते हैं।