2012-06-14 10 views
8

तो गर्मी के लिए मैंने फैसला किया कि मैं स्कूल शुरू होने से पहले एल्गोरिदम सीखना शुरू कर सकता हूं। मुझे बताया गया है कि कक्षा काफी तेज है, और यह कि एल्गोरिदम कुछ ऐसा नहीं है जिसे आपको हल्के से लेना चाहिए (मेरे पास सेमेस्टर लॉल के दौरान सभी पाठ्यक्रमों के काम के साथ ऐसा करने की प्रवृत्ति है)।एक विशिष्ट भाषा का उपयोग करके एल्गोरिदम सीखने के दृष्टिकोण

पुस्तक हम उपयोग करने के लिए जा रहे हैं इस Algorithms (4th Edition) है। वैसे भी, यह मेरी समस्या है।

मैं पुस्तक के माध्यम से लगभग तीसरा रास्ता हूं, लेकिन मुझे अभी एहसास हुआ कि मैं क्या कर रहा था। उदाहरण के लिए, मैं उन अनुभागों को पढ़ और पढ़ूंगा जिन्हें मैं समझ में नहीं आता हूं। फिर अगर मुझे पर्याप्त आत्मविश्वास महसूस होता है, तो मैं अपने सिर से जावा में एक ही एल्गोरिदम को पुन: उत्पन्न करने की कोशिश करता हूं। लेकिन ऐसा करके, मेरा कोड लगभग book..in जावा में बिल्कुल दिखता है।

मैं नहीं कह सकता कि मैं कोड के बाद कोड को याद कर रहा हूं - मैं अवधारणाओं को समझता हूं और वे मुझे इन एल्गोरिदम को कोड करने में मदद करते हैं - लेकिन मुझे लगता है कि मैं जावा में इन एल्गोरिदम को लागू करने में सक्षम हूं। मुझे ध्यान रखना चाहिए कि इस समय मुझे केवल जावा पता है।

tldr: मैं जैसे मैं गिटार बजाना सीख रहा हूँ एल्गोरिदम सीख रहा हूँ - पुनरावृत्ति के बाद पुनरावृत्ति। लेकिन ऐसा करने से मुझे लगता है कि मुझे और अधिक तय किया जा रहा है कि मैं केवल इन्हें जावा में लागू करने में सक्षम हूं। यदि आप जिस पुस्तक का उपयोग कर रहे हैं वह भाषा-विशिष्ट है तो आप एल्गोरिदम कैसे सीखेंगे?

अग्रिम धन्यवाद।

+0

मैं उन्हें पुस्तक का उपयोग करने वाली किसी भी भाषा में लिखूंगा। तब मैं उन्हें किसी और चीज में लिख सकता हूं। या ठीक इसके विपरीत। –

+1

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

+0

यह 25 जून तक उपलब्ध नहीं है, लेकिन उपयोगी साबित करने के लिए आपको [एल्गोरिदम पर यह Udacity कोर्स] (http://www.udacity.com/overview/Course/cs215) मिल सकता है। – Moses

उत्तर

9

अपने आप को भ्रमित मत

आप जावा अध्ययन कर रहे हैं, इसलिए उन्हें जावा में लिखें। विशेष रूप से यदि जावा आपकी पहली भाषा है। , अब के लिए अपने आप को भ्रमित के रूप में आप एक बार में 2 बातें जानने की कोशिश कर रहे हैं नहीं है: जावा में प ¤ करने के लिए कैसे, और कैसे प ¤ कोआप दोनों एक नई भाषा और सोचने का एक तरीका सीख रहे हैं। बहुत ज्यादा मत करो लेकिन सॉस में अब एक और भाषा जोड़ना।

विविधता

बाद में, या अगर आप पर्याप्त विश्वास है कि आप किसी अन्य भाषा पर एक साथ ले जा सकते हैं महसूस हो रहा है, तो यह स्पष्ट रूप से लाभकारी एक दूसरे से सीखते हैं और किताब की ओर देखे बिना एल्गोरिदम को दोहराने के लिए प्रयास करने के लिए किया जाएगा।

पुन: पेश और बढ़ाएँ

हम क्या सलाह देते हैं कि आप एल्गोरिदम के derivates देखने के लिए है। ज्ञात रूपों, जिन्हें दस्तावेज किया गया है, और जहां आप केवल संस्करण का वर्णन पढ़ सकते हैं ताकि आप पुस्तक को पढ़ने की आवश्यकता के बिना इसे "बेस" संस्करण से कार्यान्वित करने का प्रयास कर सकें।

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

सबसे पहले कोशिश करें, पढ़ें-पर बाद में

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

+0

मतभेदों का विश्लेषण करने में सक्षम होने के लिए इसे समझने का प्रयास करें, मुझे वास्तव में पुस्तक में उदाहरण देखने से पहले लागू करने का विचार पसंद है। – user1164937

+0

@ user1164937: जब मैंने अध्ययन किया, हम मूल रूप से कभी भी कार्यान्वयन नहीं दिखा रहे थे, हम हर समय बस कोडिंग कर रहे थे और अवरुद्ध होने पर हम सहायकों से पूछेंगे (जो 99% समय आएगा, हमारे कोड को पढ़ेंगे, हंसेंगे, पूछेंगे कि क्या था गलत या जो हम समझ में नहीं आये, और हमें "आरटीएफएम" बताते हुए समाप्त कर दिया। और हालांकि यह कठोर है, यह एक बहुत अच्छा दृष्टिकोण है।) एक बार जब हमने एक कार्यान्वयन देखा तो हम एक समूह व्याख्यान करेंगे और वे उनका प्रोजेक्ट करेंगे प्रोग्राम टाइप करते समय ऑन-स्क्रीन संपादक। नोट्स लेना प्रतिबंधित नहीं था, लेकिन सलाह नहीं दी। पहली बार किताबें फंसे हुए थे। – haylem

+0

@ user1164937: और आपका स्वागत है, अगर यह आपकी मदद करता है तो मुझे खुशी है। हमें बाद में एक नोट छोड़ दें यदि आप उस स्थान पर आधारित थे जहां आप चाहते थे :) – haylem

0

आप यह नहीं कहते कि आप एल्गोरिदम के पीछे गणित को कितनी अच्छी तरह जानते हैं। कोड के साथ आपकी सुविधा निर्धारित करने में यह महत्वपूर्ण होगा।

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

यदि आपको ऐसा लगता है कि आप जावा की प्रतिलिपि बनाने से पर्याप्त नहीं हैं, तो देखें कि क्या आप उन्हें किसी अन्य भाषा में अनुवाद कर सकते हैं, शायद पाइथन या पूरी तरह कार्यात्मक विकल्प। यदि आप ऐसा कर सकते हैं, तो आपको पता चलेगा कि आपको यह मिल गया है।

0

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

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

2

एल्गोरिदम के बारे में बात, वे अनिवार्य रूप से भाषा-अज्ञेयवादी हैं। सी, पायथन या किसी अन्य भाषा में सेडगेविक के उदाहरण करने से आपको वास्तव में कुछ भी नहीं रोक रहा है।

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

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

ओह, अगर आप एल्गोरिदम के साथ अभ्यास करना चाहते हैं, तो project euler, code kata और अन्य चुनौती साइटों को आजमाएं। ये छोटी चुनौतियां आपको भाषा के साथ परिचित कराने में मदद कर सकती हैं और साथ ही आवश्यक सोच के प्रकार से सहज महसूस कर सकती हैं।

1

सबसे पहले, कोड को सीखने के तरीके पर अपना पहला कदम उठाने पर बधाई। मैं कहूंगा कि गर्मी के दौरान आगे बढ़ने से आप अपने साथियों से पहले ही आगे बढ़ रहे हैं।

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

सबसे अच्छी सलाह जो मैं दे सकता हूं वह कोड, कोड, कोड है !! वास्तव में उन्हें लागू करने वाले एल्गोरिदम के बारे में न केवल पढ़ें।पुनरावृत्ति के बाद पुनरावृत्ति -

0

मैं जैसे मैं गिटार बजाना सीख रहा हूँ एल्गोरिदम सीख रहा हूँ।

तब आप एल्गोरिदम नहीं सीख रहे हैं। आप पुनरावृत्ति सीख रहे हैं। दो अलग-अलग चीजें एल्गोरिदम पुस्तक द्वारा प्रोग्रामिंग भाषा का उपयोग एक द्वितीयक कारक है। यह सिर्फ निर्देश का एक वाहन है, एक कार्यान्वयन विस्तार।

है यही कारण है कि आपका ध्यान होना चाहिए

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

लेकिन ऐसा करके मुझे लगता है कि मुझे और अधिक तय किया जा रहा है कि मैं जावा में इन्हें लागू करने के लिए केवल सक्षम कर दूंगा।

लेकिन वह है, क्योंकि आप पर ध्यान केंद्रित कर रहे हैं बस कैसे एल्गोरिथ्म कोडित किया जा रहा है (इस विशेष मामले में जावा में।) आप एक कार्यान्वयन विस्तार पर ध्यान केंद्रित कर रहे हैं।

जब आप ड्राइव करना सीखते हैं, तो आप इस बात पर ध्यान केंद्रित नहीं करते कि आप होंडा सिविक या निसान मैक्सिमा को कैसे ड्राइव करना सीखते हैं। आप ड्राइविंग के नियम, अंगूठे के नियम, आवश्यक सावधानी और वाहन चलाने के लिए नियंत्रित कानूनों का सार सीखते हैं।

सीखने वाले एल्गोरिदम के साथ ही। आप "जावा में एल्गोरिदम" नहीं सीखते हैं "हास्केल में एल्गोरिदम" से अधिक नहीं। आप पहले और सबसे महत्वपूर्ण एल्गोरिदम सीखते हैं, वाहन (बहुत विशेष मामलों में संतान) माध्यमिक है।

आप, क्या एल्गोरिथ्म करता है पर ध्यान केंद्रित कर दिया जाना चाहिए कैसे और क्योंजैसे प्रश्न "यह कैसे काम करता है?" और सबसे महत्वपूर्ण बात * * प्रदर्शन विशेषताओं क्या हैं? ", वे चीजें हैं जिन पर आपको ध्यान केंद्रित करना चाहिए।

प्रत्येक अच्छी एल्गोरिदम पुस्तक (सेडगेविक शामिल) उस संदेश को ले जाती है। यही आपको ध्यान देना चाहिए। आप फिर से ध्यान केंद्रित करने के लिए कैसे जाते हैं, यह किसी की व्यक्तिगत सीखने की रणनीतियों का एक कार्य है।

यदि आप जिस पुस्तक का उपयोग कर रहे हैं वह भाषा-विशिष्ट है तो आप एल्गोरिदम कैसे सीखेंगे?

भाषा पर ध्यान केंद्रित न करके। संरचना पर ध्यान केंद्रित करें, शामिल डेटा संरचनाओं पर ध्यान केंद्रित करें, इनवेरिएंट, पूर्व-स्थितियां और पोस्ट-शर्तें। बिग-ओ (या बिग-ओमिक्रॉन), लिटिल-ओ/लिटिल-ओमिक्रॉन और ओमेगा नोटेशन में वर्णित असीम व्यवहार को समझें।

आप एल्गोरिदम सीख रहे हैं, कोडिंग एल्गोरिदम के माध्यम से जावा में प्रोग्रामिंग नहीं।

यदि आप इस मानसिक छलांग नहीं कर सकते हैं, तो इसका मतलब है कि आपके पास पर्याप्त अभ्यास या अमूर्त विश्लेषण नहीं है। यह अपमान नहीं है, बल्कि एक अवलोकन और सलाह है। कोडिंग, प्रोग्रामिंग भाषा का उपयोग आमतौर पर कंप्यूटिंग के गणितीय विश्लेषण के लिए द्वितीयक है, कंप्यूटर विज्ञान का ध्यान (जिसमें से एल्गोरिदम इसका हिस्सा है।)

नोट मैं 10 साल के लिए जावा किया है, और हालांकि मैं यह काम के लिए पसंद करते हैं, मैं दृढ़ता से यह प्रोग्रामिंग या सीएस विषय सीखने के लिए एक गरीब उपकरण है विश्वास करते हैं।

ए या तो ए के साथ एल्गोरिदम सीखकर बेहतर सेवा दी जाती है) एक प्रक्रियात्मक, सिस्टम-स्तरीय प्रोग्रामिंग भाषा जैसे सी या एडा, या उच्च स्तरीय छद्म-असेंबलर सिम्युलेटर, या बी) लिस्प या हास्केल जैसी कार्यात्मक भाषा।

शुद्ध/छद्म-शुद्ध ओओ भाषाओं में ऑब्जेक्ट ओरिएंटेड फीचर्स बस रास्ते में आते हैं।

एल्गोरिदम गणितीय संरचनाएं हैं जो प्रकृति (परिचालन) और/या क्या (गणितीय) के वर्णनात्मक प्रकृति के साथ गणितीय संरचनाएं हैं। पूर्व प्रक्रियात्मक प्रोग्रामिंग के लिए पूरी तरह अनुकूल है, बाद में कार्यात्मक प्रोग्रामिंग के लिए।

+0

मुझे लगता है कि मेरे हिस्से पर समानता खराब थी, लेकिन मेरा मतलब यह था कि मैं अवधारणाओं को समझने की कोशिश करता हूं। अगर मुझे करना है तो दोबारा पढ़ें (मैंने इसे क्लिक किए जाने तक कई बार फिर से पढ़ा है)। साथ ही "मेरे ज्ञान का परीक्षण" जो मैं जावा में इसे लागू करके करता हूं, क्योंकि जावा की एकमात्र भाषा मुझे पता है। यहां तक ​​कि अगर मैं इसे पहली बार सही तरीके से कार्यान्वित करना समाप्त करता हूं, तो भी मैं इसे फिर से करता हूं क्योंकि मैं वास्तव में इसे एक दीर्घकालिक चीज़ बनाना चाहता हूं। – user1164937

+0

इसके अलावा, मुझे हास्केल में रूचि है। बहुत कुछ तो जब मैं दूसरी भाषा के बारे में सोच रहा था। मुझे एक धारणा है कि एक कार्यात्मक भाषा चोट नहीं पहुंचीगी क्योंकि मैंने सुना है कि यह एक पूरी तरह से अलग गेंद पार्क है, इसलिए मैं जावा के साथ भ्रमित नहीं होगा (मेरे पास केवल सेमेस्टर का अनुभव है)। तुम क्या सोचते हो? – user1164937

+0

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

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