डेटा संरचनाओं और एल्गोरिदम को सीखने के लिए प्रोग्रामिंग भाषा का विकल्प [बंद]


79

आप किस प्रोग्रामिंग भाषा में डेटा संरचना और एल्गोरिदम के बारे में जानने की सलाह देंगे ?

निम्नलिखित को ध्यान में रखते हुए:

  • निजी अनुभव
  • भाषा सुविधाएँ (संकेत, OO, आदि)
  • DS और A अवधारणाओं को सीखने के लिए उपयुक्तता

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

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

किसी भी तरह से, मुझे एक भाषा चुननी होगी, और मैं पूरे एक से रहना पसंद करूंगा। व्यक्तिगत भाषा वरीयताओं को अलग करना, इस उद्देश्य के लिए कौन सा सबसे अच्छा है?


विशिष्ट के अलावा इस प्रश्न का उत्तर देने का कोई संभव तरीका नहीं है, और इसके लिए अधिक जानकारी की आवश्यकता है।
डेविड थॉर्नले

@ डेविड थॉर्नले: मैं समझता हूं कि यह थोड़ा खुला हुआ है, लेकिन इसने बहुत सारे शानदार जवाब दिए हैं!
bguiz

एल्गोरिदम और डेटा संरचनाओं की ऊर्जा (प्रयुक्त: समय) की दक्षता के बारे में बहुत कुछ है: यदि और जब आप इसे मापना चाहते हैं, तो उन प्रणालियों की तलाश करें जहां सार्थक संख्याओं को पुन: प्राप्त किया जाता है (और आसानी से)।
ग्रेबर्ड डिस

जवाबों:


88

इस प्रश्न का उत्तर ठीक उसी पर निर्भर करता है जो आप सीखना चाहते हैं।

अजगर और रूबी

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

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

सी

C दूसरे चरम पर है। यह अच्छा है यदि आप वास्तव में निम्न-स्तरीय विवरण सीखना चाहते हैं जैसे कि मेमोरी कैसे प्रबंधित की जाती है, लेकिन स्मृति प्रबंधन अचानक एक महत्वपूर्ण विचार है, जैसे कि, मॉलोक () / मुक्त () का सही उपयोग। यह विचलित करने वाला हो सकता है। इसके अलावा, C ऑब्जेक्ट-ओरिएंटेड नहीं है। यह एक बुरी बात नहीं है, लेकिन ध्यान देने योग्य है।

सी ++

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

जावा

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

सी#

सी # भाषा जावा के अधिक आधुनिक संस्करण की तरह है। जावा की तरह, यह एक प्रबंधित (कचरा एकत्र) मध्यवर्ती संकलित भाषा है जो एक आभासी मशीन पर चलती है। C / C ++ के अलावा यहां सूचीबद्ध हर दूसरी भाषा भी एक वर्चुअल मशीन पर चलती है, लेकिन पायथन, रूबी, आदि की सीधे-सीधे व्याख्या की जाती है, बजाय इसके कि बायकोड को संकलित किए।

मूल रूप से जावा के रूप में C # के समान पेशेवरों और विपक्ष हैं।

हास्केल (आदि)

अंत में, आपके पास कार्यात्मक भाषाएं हैं: हास्केल, ओकेमेल, स्कीम / लिस्प, क्लोजर, एफ #, आदि। ये सभी समस्याओं के बारे में बहुत अलग तरीके से सोचते हैं और कुछ बिंदुओं पर सीखने लायक होते हैं, लेकिन फिर से यह नीचे आता है कि आप क्या सीखना चाहते हैं। कार्यात्मक प्रोग्रामिंग या डेटा संरचनाएं? मैं इस मुद्दे को भ्रमित करने के बजाय एक समय में एक चीज सीखना चाहता हूं। यदि आप कुछ बिंदु पर एक कार्यात्मक भाषा सीखते हैं (जो मैं सुझाऊंगा), हास्केल एक सुरक्षित और बढ़िया विकल्प है।

मेरी सलाह

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

मुझे समझाने दो: एक एक्स्टेंसिबल हैश टेबल को पर्याप्त तत्वों को जोड़ने पर आकार बदलने की आवश्यकता होती है। किसी भी कार्यान्वयन में इसका अर्थ होगा कि बैकिंग डेटा संरचना (आमतौर पर एक सरणी) के आकार को दोगुना करना और मौजूदा तत्वों में प्रतिलिपि बनाना। कार्यान्वयन मूल रूप से सभी अनिवार्य भाषाओं में समान है लेकिन C / C ++ में आपको विभाजन दोषों से निपटना पड़ता है जब आप किसी चीज़ को सही तरीके से आवंटित या डीललेट नहीं करते हैं।

पायथन या रूबी (यह वास्तव में कोई फर्क नहीं पड़ता है) जो मेरी अगली पसंद होगी (और अन्य दो के बहुत करीब) सिर्फ इसलिए कि पहले से डायनामिक टाइपिंग समस्याग्रस्त हो सकती है।


1
@ क्लेटस: अच्छी तरह से जवाब के लिए धन्यवाद! डीएस एंड ए पुस्तक / अन्य अनुदेश सामग्री जिसे आप सुझाएंगे (जावा या अजगर के लिए)?
बुगिज़

3
@bguiz आप उस बारे में एक अलग सवाल पूछना चाहते हो सकता है। इस विषय पर कई प्रश्न हैं stackoverflow.com/search?q=book+data+structures+algoritms आप खोज में [जावा] या [अजगर] जोड़कर उसे परिष्कृत कर सकते हैं।
cletus

2
मैं मुख्यतः सख्त OO- अभिविन्यास के कारण Java और C # का उपयोग नहीं करूंगा जो इसके लिए अनावश्यक है। इसके अलावा: जब बिंदु डेटा संरचना सीख रहा है तो जेनेरिक कोड लिखने की परवाह कौन करता है? मेरे दिमाग में, या तो आप एक स्क्रिप्टिंग भाषा (पायथन) चुनते हैं और उच्च-स्तर पर ध्यान केंद्रित करते हैं या आप एक निम्न-स्तरीय भाषा C / C ++ चुनते हैं और यह देखने की कोशिश करते हैं कि यह मशीन स्तर पर कैसे लागू किया जाता है। बीच-बीच में रुकना इसके लायक नहीं लगता।
मैथ्यू एम।

3
पायथन को पहले बाइटकोड से संकलित नहीं किया गया है? मेरे लिए समाचार: docs.python.org/release/2.5.2/lib/bytecodes.html
एडम क्रॉसलैंड

इसका कोई मतलब नहीं है: "यह महत्वपूर्ण है क्योंकि हैश टेबल जैसी डेटा संरचनाएं एक सामान्य आधार वर्ग होने पर निर्भर करती हैं।" हैश तालिकाओं को धोने योग्य होने के तत्वों पर निर्भर करता है, लेकिन यह कैसे एक प्रोग्रामिंग भाषा में लागू किया जा सकता है इसकी बारीकियां एक डेटा संरचना की सार परिभाषा में अप्रासंगिक हैं।
pyon

45

मैं Javaमुख्य रूप से सिफारिश करूंगा क्योंकि:

  • कचरा इकठा करना
  • संदर्भ
  • समृद्ध संग्रह

EDIT: मतदाताओं को समझाएं।


3
हर कोई इसे क्यों वोट कर रहा है?
मंत्र विदुषी

19
मुझे लगता है कि आप इसे गलत मानते हैं क्योंकि आपको जावा पसंद नहीं है (जो ऐसा हो रहा है) गैर-जिम्मेदाराना है। आप जावा को पसंद नहीं कर सकते हैं, लेकिन यह सीखने की भाषा के रूप में उपयोग करने के लिए पर्याप्त सरल है। तो + क मुझसे।
क्लेटस

7
+1। मेरी पसंद नहीं, लेकिन वास्तव में, यह भयानक नहीं है। वोट का स्कोर वैसा ही है जैसा आपने COBOL सुझाया है।
रोब लछलन

4
एक शुरुआत के लिए +1: 1. ठीक है, आपको मेमोरी आवंटित / डीललॉक (छोटे कार्यक्रमों के लिए कम से कम) के बारे में चिंता करने की ज़रूरत नहीं है। आप इसके बजाय उस क्षण पर ध्यान केंद्रित कर सकते हैं जो आपको सीखने को मिला। 2. हाँ, कोई डरपोक संकेत, या संकेत करने के लिए संकेत। मुझे गलत मत समझो, मुझे C ++ बहुत पसंद है। 3. जावा में संग्रह संभवत: मेरे द्वारा देखे गए डेटास्ट्रक्चर का सबसे परिष्कृत सेट है। वे वास्तव में डेटास्ट्रक्चर के तहत शब्दकोश में होना चाहिए। :)
crunchdog

9
यदि आपको समझ में नहीं आता है कि अपने स्वयं के संसाधन प्रबंधन कैसे करें, तो आपने डेटा संरचनाओं के बारे में बहुत कुछ नहीं सीखा है।
एलन

30

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


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

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

17

Pythonमहान है। पढ़ने में आसान, पूरी तरह से चित्रित। यदि आप छद्मकोड के साथ काम करने जा रहे हैं, तो पायथन बहुत परिचित दिखाई देगा।

पायथन पहले से ही यूसी इरविन में पसंद की एल्गोरिदम भाषा है , जहां इसे इस तरह वर्णित किया गया है:
" पायथन एक एल्गोरिथ्म-उन्मुख भाषा का प्रतिनिधित्व करता है जिसे शिक्षा में बेहद जरूरी है। पायथन के फायदे में इसकी पाठ्यपुस्तक-जैसी वाक्यविन्यास और सहभागिता शामिल है जो प्रयोग को प्रोत्साहित करती है। । "

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


@ एमवीआईडी: क्या एक अजगर आधारित डीएस एंड ए पुस्तक है जिसे आप सुझाएंगे?
बुगिज़

1
@bguiz: हालांकि मैंने इसे व्यक्तिगत रूप से नहीं पढ़ा है, यह मुफ्त इलेक्ट्रॉनिक पुस्तक मौजूद है जो कि पायथन में OO का उपयोग करके एल्गोरिदम और डेटा संरचनाओं पर केंद्रित है: brpreiss.com/books/opus7
Mantas Vidutis

पायथन केवल तभी बहुत अच्छा है जब आप
व्हॉट्सएप के

एक सीमांकक के रूप में व्हाट्सएप भयानक है!
मार्सेल वाल्डेज़ ओरोज़्को

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

13

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

बोनस यह भी है कि आप आसानी से डोम और कैनवस का उपयोग करके ग्राफ और पेड़ों को रेंडर करने के लिए ब्राउज़र का उपयोग करके विभिन्न डेटा संरचनाओं की कल्पना कर सकते हैं।

वर्षों से सीएस पाठ्यक्रम उस भाषा को बदलते हैं जिसमें विषय पढ़ाया जाता है, सिर्फ इसलिए कि सीखने में आसानी होने वाली भाषाओं के नए और बेहतर कार्यान्वयन आ गए हैं जिससे वास्तविक समस्या पर ध्यान केंद्रित करना आसान हो जाता है।


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

सच सच। मैं देव कोड स्निपेट में अपने कोड का परीक्षण करता हूं। इसके अलावा, मैं इसी तरह अपनी खुद की डेटा संरचनाएं लिख सकता हूं। इसमें कोई लिंक्ड सूची या कोई अन्य संरचना नहीं बनाई गई है। इवेथिंग सिर्फ ऑब्जेक्ट है। जब तक मैं प्रतिस्पर्धी प्रोग्रामिंग नहीं कर रहा हूं, यह बाइनरी सर्च, ट्राइ और अन्य सभी अवधारणाओं को सीखने के लिए काम करता है। नहीं?
हॉफडेव

पूरी तरह से सहमत हैं, चलो आप बहुत समारोह और नंगे हड्डियों के वाक्यविन्यास के बिना तर्क पर ध्यान केंद्रित करते हैं।
jtroconisa

8

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

आदर्श रूप से, मैं सी में एल्गोरिदम सीखना चाहता हूं, इसलिए आप सीख सकते हैं कि मेमोरी स्तर पर क्या हो रहा है; मैं एक कार्यात्मक भाषा में एल्गोरिदम सीखना चाहता हूं, ताकि आप देख सकें कि कैसे समान एल्गोरिदम लगातार डेटा संरचनाओं के साथ काम करते हैं।

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

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

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


@ रोब लछलन: क्या एक अजगर आधारित डीएस और एक पुस्तक है जो आप सुझाएंगे?
बुगिज़

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

8

मैं आद्या को सुझाव दूंगा। इसमें अन्य भाषाओं में नहीं पाए गए डेटा कंस्ट्रक्शन की विशेषताएं हैं, जैसे रेंज चेक type Day is range 1 .. 31;इसके अलावा इसमें बहुत सख्त संकलन-समय और रन-टाइम चेकिंग है (जब तक कि आप इसे बंद नहीं चुनते हैं), जिससे आपके कार्यान्वयन में कीड़े ढूंढना आसान हो जाता है।


8

ओबेरॉन -2 या घटक पास्कल । आखिरी वाला पहले वाले का सुपरसेट है।

आइंस्टीन ने एक बार कहा था "इसे जितना संभव हो उतना सरल बनाओ, लेकिन सरल नहीं।" इस वाक्यांश को प्रो। निकलौस विर्थ ने मूल ओबेरॉन भाषा की रिपोर्ट के रूप में चुना था। और यह ऊपर वर्णित ओबेरोन के वंशजों के लिए सच है।

जब प्रोग्रामिंग भाषा की पूर्णता की बात आती है, तो मैं एंटोनी डी सेंट-एक्सुप्री को उद्धृत करना पसंद करता हूं: "एक डिजाइनर जानता है कि वह पूर्णता पर आ गया है जब कोई जोड़ नहीं है, लेकिन वेन अब दूर ले जाने के लिए कुछ भी नहीं है।" । यह हासिल न होने पर भी, सही रास्ते पर है। "Wirth प्रोग्रामिंग लैंग्वेज लाइन" (Algol -> पास्कल -> मोडुला -2 -> ओबेरॉन -> ओबेरॉन -2) प्रत्येक बाद की भाषा सरल और एक ही समय में पिछले एक की तुलना में अधिक शक्तिशाली है।

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

जब आप एल्गोरिदम और डेटा संरचना सीखना चाहते हैं, तो आप इसका मतलब है। लेकिन अगर आपकी भाषा "शक्तिशाली" है (इसमें C ++, C #, Java, Python, ... जैसी बहुत सी विशेषताएं हैं) तो आप बहुत कुछ सीखने की भाषा को बर्बाद कर देंगे, एल्गोरिदम और डेटा संरचनाओं को नहीं। आप पेड़ों के लिए जंगल नहीं देखेंगे। =) आप पेड़ों को सिंटैक्स तत्वों (और किसी भी अन्य सुविधाओं) और वन के रूप में महत्वपूर्ण अवधारणा (किसी भी एल्गोरिथ्म, डेटा संरचना, ओओपी, जो भी हो) के रूप में सोच सकते हैं। आपकी भाषा में जितनी अधिक विशेषताएं (पेड़) हैं, उतने ही जटिल कदम पीछे हटने और अवधारणाओं को समझने (जंगल को देखने) का काम बन जाता है।

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

एल्गोरिदम और डेटा संरचनाओं पर भी कई किताबें अल्गोल / पास्कल-जैसे स्यूडोकोड का उपयोग करती हैं और इस भाषा में उदाहरणों को परिवर्तित करना आसान होगा। और आप सीधे Wirth की "Algorithms and Data Structures" पुस्तक से उदाहरणों का उपयोग कर सकते हैं। ओबेरॉन संस्करण (2004), पीडीएफ (1.2 एमबी)।

कुछ अतिरिक्त लिंक:


@kemiisto: uniuue के लिए धन्यवाद, और उपन्यास, उत्तर - और उपमा! मैं ओबेरोन -2 में भी देखूंगा।
बुगिज़

2
कहावत का अंग्रेजी संस्करण "पेड़ों के लिए जंगल नहीं देख सकता।"
डैनियल रोज

6

"यदि आपका एकमात्र उपकरण एक हथौड़ा है तो आपकी सभी समस्याएं नाखूनों की तरह दिखेंगी"

कम से कम कुछ भाषाएँ सीखें।

साथ ही, आपकी पसंद आपके उद्देश्य पर निर्भर करती है।

हॉबी? विंडोज की दुनिया में नौकरी? लिनक्स / यूनिक्स परिवार?

अनुप्रयोगों का प्रकार: व्यवसाय बनाम वैज्ञानिक; हार्डवेयर ड्राइवर या अनुप्रयोग?

डेस्कटॉप अनुप्रयोग या वेब अनुप्रयोग?

मेरे पास आपके लिए कई सुझाव हैं।

(ए) निश्चित रूप से कुछ जे सीखें (jsoftware.com से मुक्त, एपीएल के उत्तराधिकारी; जे और एपीएल दोनों केन आइवरसन, ट्यूरिंग विजेता की रचना हैं ... ट्यूरिंग पुरस्कार कंप्यूटिंग में नोबेल पुरस्कार की तरह है)।

(b) यदि आप विंडोज की दुनिया में हैं, तो c # से शुरू करें क्योंकि .NET में बहुत अधिक # c पर चलता है। यदि आप कर सकते हैं, तो Microsoft प्रेस से टॉम आर्चर के "इनसाइड c #" की एक प्रति प्राप्त करें। आप Microsoft के एक्सप्रेस संस्करण को डाउनलोड करके एक मुफ्त c # विकास प्रणाली प्राप्त कर सकते हैं।

(c) TDD / BDD का उपयोग करना सीखें ... भाषा की परवाह किए बिना, पहले आप एक छोटा परीक्षण लिखें जिसे एक इकाई परीक्षण कहा जाता है; आगे आप यूनिट टेस्ट पास करने के लिए प्रोडक्शन कोड लिखते हैं; एक समय में एक छोटा सा कदम ... यह सिर्फ आपके द्वारा उपयोग की जाने वाली भाषा नहीं है, यह कार्यप्रणाली भी है।

(d) कुछ असेंबलर भाषा सीखें ... कोडांतरक निम्न स्तर, लगभग मशीन भाषा है, यह आपको पर्दे के पीछे क्या चल रहा है इसकी अच्छी समझ देगा।

(ई) विंडोज की दुनिया के बाहर, मैं c ++ की सिफारिश करूंगा।

कोई सर्वश्रेष्ठ भाषा नहीं है।

यदि यह केवल भाषा के बारे में होता, तो प्रोग्रामिंग करना आसान होता।

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

एक बात निश्चित है: यदि आप एक प्रोग्रामर बनने जा रहे हैं तो आप यह जानने के लिए कभी भी बाहर नहीं भागेंगे।


भाषा के पूरी तरह से विचारधारा के लिए @bguiz डेटा संरचनाएं हो सकती हैं; यह विभिन्न भाषाओं को सीखने का एक कारण है। आप सूक्ष्म अंतर भी सामना करेंगे जो निराशा और यहां तक ​​कि दुःख का कारण बन सकता है; उदाहरण के लिए, डेटा प्रकार नामकरण: SQL सर्वर के लिए बिट c # के लिए बूल और vb के लिए बूलियन है। डेटा प्रकार का आकार भी भिन्न होता है; उदाहरण, c # में int 32 बिट में तय किया गया है जहाँ c ++ में इसका आकार और इसलिए इसकी भंडारण क्षमता प्लेटफ़ॉर्म पर निर्भर करती है। चरित्र सेट आपके डेटा संरचना आकार को भी प्रभावित करते हैं; उदाहरण, 7-बिट ASCII, 8-बिट ASCII, यूनिकोड। फिर निश्चित आकार बनाम भिन्नता है, वगैरह।
gerryLowry

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

एक बार ओओ में कुशल होने के बाद, घोषणात्मक प्रोग्रामिंग को कवर करने का प्रयास करें।
ग्रेबर्ड

4

आप बीजीय डेटाटिप्स और मानक एमएल, ओकेमेल, एफ # या हास्केल जैसे पैटर्न के साथ एक भाषा की सराहना कर सकते हैं। उदाहरण के लिए, यहाँ OCaml / F # में लिखे गए लाल-काले बाइनरी सर्च ट्री को रीबैलेंस करने का एक कार्य है:

let balance = function
  | R(R(a, x, b), y, c), z, d | R(a, x, R(b, y, c)), z, d
  | a, x, R(R(b, y, c), z, d) | a, x, R(b, y, R(c, z, d)) ->
      R(B(a, x, b), y, B(c, z, d))
  | a, x, b -> B(a, x, b)

10
आपकी व्यंग्य की सराहना की जाती है, सर।
मिटा देता है

4

मुझे लगता है कि लिस्प में देखने लायक है।

मेरा पहला विश्वविद्यालय प्रोग्रामिंग पाठ्यक्रम लिस्प में था। इससे पहले मैं 10 वर्षों से कई भाषाओं में कार्यक्रम लिख रहा था। मैंने सोचा था कि पहला प्रोग्रामिंग कोर्स उबाऊ होगा, लेकिन मैं गलत था।

लिस्प एक बहुत ही रोचक भाषा है क्योंकि इसमें एक बहुत ही सरल वाक्य रचना है। सिंटैक्स से कार्यक्षमता में बदलाव पर ध्यान दें। कार्यात्मक प्रोग्रामिंग शैली भी सीखने के लिए एक अत्यंत मूल्यवान चीज है। अपने लिस्प कोर्स के बाद मैंने अपने आप को पूरी तरह से नए, बेहतर तरीके से C ++ में प्रोग्राम लिखना पाया, नई अवधारणाओं के लिए धन्यवाद लिस्प ने मुझे सिखाया था।

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


2

मैं गलत हो सकता हूं, लेकिन प्रोग्रामिंग भाषाओं से स्वतंत्र डेटा संरचनाएं और एल्गोरिदम नहीं हैं?

अंत में, डेटा संरचनाएं डेटा को व्यवस्थित करने का एक तरीका है; किसी भी उच्च स्तरीय भाषा का समर्थन करेगा। निश्चित रूप से, कुछ भाषाओं में बुनियादी डेटा संरचना (जैसे जावा या C ++ STL में संग्रह फ्रेमवर्क) को लागू करने वाले तंत्र होंगे, लेकिन यह आपको आपकी पसंद की प्रोग्रामिंग भाषा में प्रोग्रामिंग डेटा संरचना से नहीं रोकता है। इसके अलावा, एल्गोरिदम pseudocode में लिखे गए हैं, जो उन्हें भाषा को स्वतंत्र बनाते हैं।

मुझे पता है कि यह वास्तव में आपके प्रश्न का उत्तर नहीं दे रहा है, लेकिन मुझे यह समझने में परेशानी हो रही है कि आप क्या देख रहे हैं; डेटा संरचना / एल्गोरिदम सीखना या एक नई भाषा सीखना।


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

@Pran: "मैं गलत हो सकता हूं, लेकिन प्रोग्रामिंग भाषाओं से स्वतंत्र डेटा संरचनाएं और एल्गोरिदम नहीं हैं?"। यदि भाषा GC प्रदान नहीं करती है, तो आपको एक लिखना पड़ सकता है।
JD


0

मुझे C ++ पसंद है :)


19
-1 C ++ एक भयानक सीखने की भाषा है (और यकीनन आप उस कथन से "सीखना" क्वालिफायर छोड़ सकते हैं)।
क्लेटस

4
उसे C ++ में अपने एल्गोरिदम को कोड करने के लिए C ++ के अंधेरे कोनों को सीखने की आवश्यकता नहीं है। C ++ पूरी तरह से ठीक है।
प्रसून सौरव

9
इसलिए आपको लगता है कि C ++ में DS के लिए क्लास को कोड करना और कोड करना अच्छा है। कॉपी कंस्ट्रक्टर बनाम अंतर ऑपरेटर के बीच के अंतर को पकड़ना, समान ऑपरेटर, संदर्भ और पॉइंटर्स के दायरे से बाहर हो जाना, गलत नए से मेमोरी लीकेज करना - हटाना उपयोग, आदि? जिनमें से सभी C ++ के लिए बहुत ही मौलिक हैं।
क्लेटस

5
लेकिन बात यह है कि आप अजगर या जावा में उन चीजों को सीखने के लिए नहीं है। C ++ को बहुत बड़े प्रारंभिक निवेश की आवश्यकता होती है, और यह किसी भी तरह से ओपी के अनुरोधित फ़ंक्शन के लिए अधिक मूल्यवान नहीं है
मंत्र विदुतिस

2
जावास्क्रिप्ट के लिए कोई भी वैध कारण @cletus सीखने के लिए अनुशंसित नहीं है?
हाफवेबडेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.