CodeGym /Java Blog /यादृच्छिक /अल्गोरिदमिक जटिलता
John Squirrels
पातळी 41
San Francisco

अल्गोरिदमिक जटिलता

यादृच्छिक या ग्रुपमध्ये प्रकाशित केले
हाय! आजचा धडा बाकीच्यांपेक्षा थोडा वेगळा असेल. ते फक्त अप्रत्यक्षपणे Java शी संबंधित आहे यात फरक असेल. अल्गोरिदमिक जटिलता - १ ते म्हणाले, हा विषय प्रत्येक प्रोग्रामरसाठी खूप महत्वाचा आहे. आपण अल्गोरिदम बद्दल बोलणार आहोत . अल्गोरिदम म्हणजे काय? सोप्या भाषेत, हा काही क्रियांचा क्रम आहे जो इच्छित परिणाम प्राप्त करण्यासाठी पूर्ण करणे आवश्यक आहे . दैनंदिन जीवनात आपण अल्गोरिदम वापरतो. उदाहरणार्थ, दररोज सकाळी तुमच्याकडे एक विशिष्ट कार्य आहे: शाळेत किंवा कामावर जा आणि त्याच वेळी:
  • कपडे घातले
  • स्वच्छ
  • फेड
कोणता अल्गोरिदम तुम्हाला हा परिणाम साध्य करू देतो?
  1. अलार्म घड्याळ वापरून जागे व्हा.
  2. शॉवर घ्या आणि स्वत: ला धुवा.
  3. नाश्ता आणि कॉफी किंवा चहा बनवा.
  4. खा.
  5. जर तुम्ही आदल्या संध्याकाळी तुमचे कपडे इस्त्री केले नाहीत तर ते इस्त्री करा.
  6. कपडे घाल.
  7. घर सोड.
क्रियांचा हा क्रम निश्चितपणे आपल्याला इच्छित परिणाम प्राप्त करू देईल. प्रोग्रामिंगमध्ये, आम्ही कार्ये पूर्ण करण्यासाठी सतत कार्यरत असतो. या कार्यांचा एक महत्त्वपूर्ण भाग आधीच ज्ञात असलेल्या अल्गोरिदम वापरून केला जाऊ शकतो. उदाहरणार्थ, समजा तुमचे कार्य हे आहे: अॅरेमध्ये 100 नावांची यादी क्रमवारी लावा . हे कार्य अगदी सोपे आहे, परंतु ते वेगवेगळ्या प्रकारे सोडवले जाऊ शकते. येथे एक संभाव्य उपाय आहे: नावांची वर्णमाला क्रमवारी लावण्यासाठी अल्गोरिदम:
  1. Webster's Third New International Dictionary ची 1961 ची आवृत्ती विकत घ्या किंवा डाउनलोड करा.
  2. या शब्दकोशात आमच्या यादीतील प्रत्येक नाव शोधा.
  3. कागदाच्या तुकड्यावर, नाव असलेल्या शब्दकोशाचे पृष्ठ लिहा.
  4. नावांची क्रमवारी लावण्यासाठी कागदाचे तुकडे वापरा.
अशा कृतींचा क्रम आपले कार्य पूर्ण करेल का? होय, नक्कीच होईल. हा उपाय प्रभावी आहे का ? महत्प्रयासाने. येथे आपण अल्गोरिदमच्या आणखी एका महत्त्वाच्या पैलूंकडे आलो आहोत: त्यांची कार्यक्षमता . हे कार्य पूर्ण करण्याचे अनेक मार्ग आहेत. परंतु प्रोग्रामिंग आणि सामान्य जीवनात, आम्हाला सर्वात कार्यक्षम मार्ग निवडायचा आहे. जर तुमचे काम टोस्टचा लोणी बनवायचे असेल तर तुम्ही गहू पेरून आणि गायीचे दूध देऊन सुरुवात करू शकता. पण ते अकार्यक्षम असेलउपाय - यास खूप वेळ लागेल आणि खूप पैसे लागतील. ब्रेड आणि बटर खरेदी करून तुम्ही तुमचे सोपे काम पूर्ण करू शकता. जरी ते तुम्हाला समस्येचे निराकरण करू देत असले तरी, गहू आणि गाय यांचा समावेश असलेले अल्गोरिदम व्यवहारात वापरण्यासाठी खूप जटिल आहे. प्रोग्रामिंगमध्ये, अल्गोरिदमच्या जटिलतेचे मूल्यांकन करण्यासाठी आमच्याकडे बिग ओ नोटेशन नावाचे विशेष नोटेशन आहे. बिग ओ इनपुट डेटा आकारावर अल्गोरिदमची अंमलबजावणी वेळ किती अवलंबून आहे याचे मूल्यांकन करणे शक्य करते . चला सर्वात सोपा उदाहरण पाहू: डेटा ट्रान्सफर. कल्पना करा की तुम्हाला काही माहिती फाईलच्या स्वरूपात लांब अंतरावर पाठवायची आहे (उदाहरणार्थ, 5000 मैल). कोणता अल्गोरिदम सर्वात कार्यक्षम असेल? हे तुम्ही काम करत असलेल्या डेटावर अवलंबून आहे. उदाहरणार्थ, समजा आपल्याकडे 10 एमबीची ऑडिओ फाइल आहे. अल्गोरिदमिक जटिलता - 2या प्रकरणात, इंटरनेटवर फाइल पाठवणे हे सर्वात कार्यक्षम अल्गोरिदम आहे. यास दोन मिनिटांपेक्षा जास्त वेळ लागणार नाही! चला आमचे अल्गोरिदम पुन्हा सांगू: "जर तुम्हाला 5000 मैलांच्या अंतरावर फाइल्सच्या स्वरूपात माहिती हस्तांतरित करायची असेल, तर तुम्ही डेटा इंटरनेटद्वारे पाठवावा". उत्कृष्ट. आता त्याचे विश्लेषण करूया. ते आमचे कार्य पूर्ण करते का?बरं, होय, ते करते. पण त्याच्या जटिलतेबद्दल आपण काय म्हणू शकतो? हम्म, आता गोष्टी अधिक मनोरंजक होत आहेत. वस्तुस्थिती अशी आहे की आमचे अल्गोरिदम इनपुट डेटावर खूप अवलंबून आहे, म्हणजे फाइल्सच्या आकारावर. जर आमच्याकडे 10 मेगाबाइट्स असतील तर सर्वकाही ठीक आहे. पण जर आम्हाला 500 मेगाबाइट्स पाठवायचे असतील तर? 20 गीगाबाइट्स? 500 टेराबाइट्स? 30 पेटाबाइट्स? आमचे अल्गोरिदम कार्य करणे थांबवेल? नाही, या सर्व प्रमाणात डेटा खरोखर हस्तांतरित केला जाऊ शकतो. जास्त वेळ लागेल का? हो हे होऊ शकत! आता आम्हाला आमच्या अल्गोरिदमचे एक महत्त्वाचे वैशिष्ट्य माहित आहे: पाठवायचा डेटा जितका मोठा असेल तितका अल्गोरिदम चालवायला जास्त वेळ लागेल. परंतु आम्हाला या संबंधाची अधिक अचूक समज हवी आहे (इनपुट डेटा आकार आणि तो पाठवण्यासाठी लागणारा वेळ यामधील). आमच्या बाबतीत, अल्गोरिदमिक जटिलता रेखीय आहे . "लिनियर" म्हणजे इनपुट डेटाचे प्रमाण जसजसे वाढत जाईल, तसतसा तो पाठवायला लागणारा वेळ अंदाजे प्रमाणात वाढेल. जर डेटाचे प्रमाण दुप्पट झाले तर तो पाठवण्यासाठी लागणारा वेळ दुप्पट होईल. जर डेटा 10 पट वाढला, तर ट्रान्समिशन वेळ 10 पट वाढेल. मोठ्या O नोटेशनचा वापर करून, आपल्या अल्गोरिदमची जटिलता O(n) म्हणून व्यक्त केली जाते.. तुम्ही हे नोटेशन भविष्यासाठी लक्षात ठेवावे — ते नेहमी रेखीय जटिलतेसह अल्गोरिदमसाठी वापरले जाते. लक्षात घ्या की आम्ही येथे वेगवेगळ्या गोष्टींबद्दल बोलत नाही आहोत: इंटरनेटचा वेग, आमच्या संगणकाची संगणकीय शक्ती इ. अल्गोरिदमच्या जटिलतेचे मूल्यांकन करताना, या घटकांचा विचार करण्यात अर्थ नाही — कोणत्याही परिस्थितीत, ते आमच्या नियंत्रणाबाहेर आहेत. बिग ओ नोटेशन अल्गोरिदमची जटिलता व्यक्त करते, ते ज्या "पर्यावरण" मध्ये चालते ते नाही. चला आपल्या उदाहरणासह पुढे जाऊ या. समजा की आपण शेवटी शिकलो की आपल्याला एकूण 800 टेराबाइट्स फाइल्स पाठवायची आहेत. आम्ही अर्थातच त्यांना इंटरनेटवर पाठवून आमचे कार्य पूर्ण करू शकतो. फक्त एक समस्या आहे: मानक घरगुती डेटा ट्रान्समिशन दरांवर (100 मेगाबिट प्रति सेकंद), यास अंदाजे 708 दिवस लागतील. जवळपास २ वर्षे! :O आमचा अल्गोरिदम स्पष्टपणे येथे योग्य नाही. आम्हाला दुसरा उपाय हवा आहे! अनपेक्षितपणे, आयटी दिग्गज ऍमेझॉन आमच्या बचावासाठी आला! Amazon ची Snowmobile सेवा आम्हाला मोबाईल स्टोरेजवर मोठ्या प्रमाणात डेटा अपलोड करू देते आणि नंतर तो ट्रकने इच्छित पत्त्यावर वितरित करू देते! अल्गोरिदमिक जटिलता - 3तर, आमच्याकडे एक नवीन अल्गोरिदम आहे! "जर तुम्हाला 5000 मैलांच्या अंतरावर फाईल्सच्या स्वरूपात माहिती हस्तांतरित करायची असेल आणि तसे केल्यास इंटरनेटद्वारे पाठवण्यास 14 दिवसांपेक्षा जास्त वेळ लागेल, तर तुम्ही Amazon ट्रकवर डेटा पाठवावा." आम्ही येथे 14 दिवस अनियंत्रितपणे निवडले. आपण प्रतीक्षा करू शकणारा हा प्रदीर्घ कालावधी आहे असे म्हणूया. चला आमच्या अल्गोरिदमचे विश्लेषण करूया. त्याच्या वेगाचे काय? ट्रक फक्त 50 मैल प्रतितास वेगाने प्रवास करत असला तरी तो 5000 मैल फक्त 100 तासात कापेल. हे चार दिवस थोडे जास्त आहे! इंटरनेटवर डेटा पाठवण्याच्या पर्यायापेक्षा हे खूप चांगले आहे. आणि या अल्गोरिदमच्या जटिलतेबद्दल काय? ते रेखीय देखील आहे, म्हणजे O(n)? नाही तो नाही आहे. शेवटी, ट्रकला तुम्ही किती जास्त लोड करता याकडे लक्ष देत नाही — तो अजूनही त्याच वेगाने चालवेल आणि वेळेवर पोहोचेल. आमच्याकडे 800 टेराबाइट्स असोत किंवा त्यापेक्षा 10 पट, ट्रक अजूनही 5 दिवसात त्याच्या गंतव्यस्थानावर पोहोचेल. दुसऱ्या शब्दांत, ट्रक-आधारित डेटा ट्रान्सफर अल्गोरिदममध्ये सतत जटिलता असते. येथे, "स्थिर" म्हणजे ते इनपुट डेटा आकारावर अवलंबून नाही. ट्रकमध्ये 1GB फ्लॅश ड्राइव्ह ठेवा, तो 5 दिवसात येईल. 800 टेराबाइट डेटा असलेल्या डिस्कमध्ये ठेवा, तो 5 दिवसात येईल. मोठे O नोटेशन वापरताना, स्थिर जटिलता O(1) द्वारे दर्शविली जाते . आम्ही O(n) आणि O(1) शी परिचित झालो आहोत , त्यामुळे आता प्रोग्रामिंगच्या जगात आणखी उदाहरणे पाहू या :) समजा तुम्हाला 100 संख्यांचा अ‍ॅरे देण्यात आला आहे आणि त्या प्रत्येकावर प्रदर्शित करणे हे कार्य आहे. कन्सोल. आपण एक सामान्य forलूप लिहा जे हे कार्य करते

int[] numbers = new int[100];
// ...fill the array with numbers

for (int i: numbers) {
   System.out.println(i);
}
या अल्गोरिदमची जटिलता काय आहे? रेखीय, म्हणजे O(n). प्रोग्रामने केलेल्या क्रियांची संख्या त्यावर किती संख्या पास केली जाते यावर अवलंबून असते. अॅरेमध्ये 100 संख्या असल्यास, 100 क्रिया असतील (स्क्रीनवर स्ट्रिंग प्रदर्शित करण्यासाठी विधाने). अॅरेमध्ये 10,000 संख्या असल्यास, 10,000 क्रिया केल्या पाहिजेत. आमचे अल्गोरिदम कोणत्याही प्रकारे सुधारले जाऊ शकते? नाही. काहीही असले तरी, कन्सोलवर स्ट्रिंग्स प्रदर्शित करण्यासाठी आपल्याला अॅरेमधून N पास करावे लागतील आणि N विधाने कार्यान्वित करावी लागतील. आणखी एक उदाहरण विचारात घ्या.

public static void main(String[] args) {

   LinkedList<Integer> numbers = new LinkedList<>();
   numbers.add(0, 20202);
   numbers.add(0, 123);
   numbers.add(0, 8283);
}
आमच्याकडे एक रिक्त आहे LinkedListज्यामध्ये आम्ही अनेक संख्या समाविष्ट करतो. आम्हाला आमच्या उदाहरणात एकच संख्या घालण्याच्या अल्गोरिदमिक जटिलतेचे मूल्यांकन करणे आवश्यक आहे LinkedListआणि ते सूचीमधील घटकांच्या संख्येवर कसे अवलंबून आहे. उत्तर आहे O(1), म्हणजे स्थिर जटिलता . का? लक्षात ठेवा की आम्ही प्रत्येक क्रमांक सूचीच्या सुरुवातीला समाविष्ट करतो. या व्यतिरिक्त, तुम्हाला आठवत असेल की जेव्हा तुम्ही a मध्ये संख्या टाकता तेव्हा LinkedListघटक कुठेही हलत नाहीत. दुवे (किंवा संदर्भ) अद्यतनित केले जातात (आपण LinkedList कसे कार्य करते हे विसरल्यास, आमच्या जुन्या धड्यांपैकी एक पहा ). जर आमच्या यादीतील पहिला क्रमांक x, आणि आम्ही सूचीच्या समोर y क्रमांक टाकला, तर आम्हाला हे करणे आवश्यक आहे:

x.previous  = y;
y.previous = null;
y.next = x;
जेव्हा आम्ही दुवे अद्यतनित करतो, तेव्हा आम्ही एक किंवा एक अब्ज, मध्ये आधीच किती संख्या आहेत याची आम्हाला पर्वा नाही . LinkedListअल्गोरिदमची जटिलता स्थिर आहे, म्हणजे O(1).

लॉगरिदमिक जटिलता

घाबरू नका! :) जर "लोगॅरिथमिक" शब्दामुळे तुम्हाला हा धडा बंद करायचा असेल आणि वाचन थांबवायचे असेल, तर काही मिनिटे थांबा. येथे कोणतेही वेडे गणित असणार नाही (इतर ठिकाणी असे बरेच स्पष्टीकरण आहेत), आणि आम्ही प्रत्येक उदाहरण वेगळे करू. कल्पना करा की तुमचे कार्य 100 संख्यांच्या अॅरेमध्ये एक विशिष्ट संख्या शोधणे आहे. अधिक तंतोतंत, आपल्याला ते आहे की नाही हे तपासण्याची आवश्यकता आहे. आवश्यक संख्या सापडताच, शोध समाप्त होईल आणि तुम्ही कन्सोलमध्ये खालील प्रदर्शित कराल: "आवश्यक संख्या सापडली! अॅरेमध्ये त्याची अनुक्रमणिका = ....." तुम्ही हे कार्य कसे पूर्ण कराल? येथे समाधान स्पष्ट आहे: तुम्हाला पहिल्यापासून (किंवा शेवटच्या) पासून सुरुवात करून अॅरेच्या घटकांवर एक-एक करून पुनरावृत्ती करणे आवश्यक आहे आणि सध्याचा क्रमांक तुम्ही शोधत असलेल्या क्रमांकाशी जुळतो का ते तपासा. त्यानुसार, क्रियांची संख्या थेट अॅरेमधील घटकांच्या संख्येवर अवलंबून असते. जर आमच्याकडे 100 संख्या असतील, तर आम्हाला संभाव्यतः पुढील घटकावर 100 वेळा जाण्याची आणि 100 तुलना करण्याची आवश्यकता असू शकते. जर 1000 संख्या असतील तर 1000 तुलना होऊ शकतात. हे स्पष्टपणे रेखीय जटिलता आहे, म्हणजेO(n) . आणि आता आम्ही आमच्या उदाहरणामध्ये एक परिष्करण जोडू: ज्या अॅरेमध्ये तुम्हाला संख्या शोधायची आहे ती चढत्या क्रमाने क्रमवारी लावली आहे . यामुळे आमच्या कार्यात काही बदल होतो का? आम्ही अद्याप इच्छित क्रमांकासाठी ब्रूट-फोर्स शोध करू शकतो. परंतु वैकल्पिकरित्या, आम्ही सुप्रसिद्ध बायनरी शोध अल्गोरिदम वापरू शकतो . अल्गोरिदमिक जटिलता - 5इमेजच्या वरच्या ओळीत, आपल्याला एक क्रमबद्ध अॅरे दिसतो. आपल्याला त्यात 23 क्रमांक शोधण्याची गरज आहे. संख्यांवर पुनरावृत्ती करण्याऐवजी, आम्ही अॅरेला फक्त 2 भागांमध्ये विभाजित करतो आणि अॅरेमधील मधली संख्या तपासतो. सेल 4 मध्ये असलेला नंबर शोधा आणि तो तपासा (प्रतिमेतील दुसरी पंक्ती). ही संख्या 16 आहे, आणि आम्ही 23 शोधत आहोत. सध्याची संख्या आम्ही जे शोधत आहोत त्यापेक्षा कमी आहे. याचा अर्थ काय? याचा अर्थ असा कीमागील सर्व क्रमांक (जे 16 क्रमांकाच्या आधी आहेत) तपासण्याची गरज नाही : ते आम्ही शोधत असलेल्या क्रमांकापेक्षा कमी असण्याची हमी आहे, कारण आमची अॅरे क्रमवारी लावलेली आहे! आम्ही उर्वरित 5 घटकांमध्ये शोध सुरू ठेवतो. टीप:आम्ही फक्त एक तुलना केली आहे, परंतु आम्ही संभाव्य पर्यायांपैकी अर्धे आधीच काढून टाकले आहेत. आमच्याकडे फक्त 5 घटक शिल्लक आहेत. उर्वरित सबअरे अर्ध्यामध्ये विभाजित करून आणि पुन्हा मधला घटक (इमेजमधील 3री पंक्ती) घेऊन आम्ही आमची मागील पायरी पुन्हा करू. संख्या 56 आहे आणि ती आम्ही शोधत असलेल्यापेक्षा मोठी आहे. याचा अर्थ काय? याचा अर्थ असा आहे की आम्ही आणखी 3 शक्यता काढून टाकल्या आहेत: स्वतः 56 संख्या आणि त्यानंतरच्या दोन संख्या (कारण ते 23 पेक्षा जास्त असण्याची हमी दिली जाते, कारण अॅरे क्रमवारी लावलेला आहे). आमच्याकडे तपासण्यासाठी फक्त 2 अंक उरले आहेत (प्रतिमेतील शेवटची पंक्ती) — अॅरे निर्देशांक 5 आणि 6 सह संख्या. आम्ही त्यापैकी पहिला तपासतो, आणि आम्ही जे शोधत होतो ते शोधतो — क्रमांक 23! त्याचा निर्देशांक 5 आहे! चला आपल्या अल्गोरिदमचे परिणाम बघूया आणि मग आपण' त्याच्या जटिलतेचे विश्लेषण करू. तसे, आता तुम्हाला समजले आहे की याला बायनरी शोध का म्हणतात: ते वारंवार डेटा अर्ध्यामध्ये विभाजित करण्यावर अवलंबून आहे. परिणाम प्रभावी आहे! जर आम्‍ही संख्‍या शोधण्‍यासाठी रेखीय शोध वापरला, तर आम्‍हाला 10 पर्यंत तुलना करण्‍याची आवश्‍यकता असेल, परंतु बायनरी शोधाने, आम्‍ही केवळ 3 सह कार्य पूर्ण केले! सर्वात वाईट परिस्थितीत, 4 तुलना होतील (जर शेवटच्या टप्प्यात आम्हाला हवी असलेली संख्या पहिल्या ऐवजी उर्वरित शक्यतांपैकी दुसरी असेल. तर त्याच्या जटिलतेचे काय? हा एक अतिशय मनोरंजक मुद्दा आहे :) बायनरी शोध अल्गोरिदम रेखीय शोध अल्गोरिदम (म्हणजे, साधे पुनरावृत्ती) पेक्षा अॅरेमधील घटकांच्या संख्येवर खूप कमी अवलंबून असते. अ‍ॅरेमधील 10 घटकांसह , रेखीय शोधासाठी जास्तीत जास्त 10 तुलनांची आवश्यकता असेल, परंतु बायनरी शोधासाठी जास्तीत जास्त 4 तुलनांची आवश्यकता असेल. तो 2.5 च्या घटकाने फरक आहे. परंतु 1000 घटकांच्या अ‍ॅरेसाठी , एका रेखीय शोधासाठी 1000 तुलनांची आवश्यकता असेल, परंतु बायनरी शोधासाठी फक्त 10 ची आवश्यकता असेल ! फरक आता 100 पट आहे! टीप:अॅरेमधील घटकांची संख्या 100 पट वाढली आहे (10 ते 1000 पर्यंत), परंतु बायनरी शोधासाठी आवश्यक असलेल्या तुलनांची संख्या केवळ 2.5 (4 ते 10 पर्यंत) च्या घटकाने वाढली आहे. जर आपण 10,000 घटकांपर्यंत पोहोचलो , तर फरक अधिक प्रभावी होईल: रेखीय शोधासाठी 10,000 तुलना आणि बायनरी शोधासाठी एकूण 14 तुलना . आणि पुन्हा, जर घटकांची संख्या 1000 पटीने वाढली (10 ते 10000 पर्यंत), तर तुलनांची संख्या केवळ 3.5 (4 ते 14 पर्यंत) च्या घटकाने वाढते. बायनरी शोध अल्गोरिदमची जटिलता लॉगरिदमिक आहे , किंवा, जर आपण मोठे O नोटेशन, O(log n) वापरतो.. असे का म्हणतात? लॉगरिदम घातांकाच्या विरुद्ध आहे. बायनरी लॉगॅरिथम ही संख्या प्राप्त करण्यासाठी संख्या 2 वाढवणे आवश्यक असलेली शक्ती आहे. उदाहरणार्थ, आमच्याकडे 10,000 घटक आहेत जे आम्हाला बायनरी शोध अल्गोरिदम वापरून शोधण्याची आवश्यकता आहे. अल्गोरिदमिक जटिलता - 6सध्या, हे करण्यासाठी जास्तीत जास्त 14 तुलना करणे आवश्यक आहे हे जाणून घेण्यासाठी तुम्ही मूल्यांचे सारणी पाहू शकता. परंतु जर कोणीही अशी सारणी प्रदान केली नसेल आणि आपल्याला अचूक कमाल संख्येची तुलना करण्याची आवश्यकता असेल तर? आपल्याला फक्त एका साध्या प्रश्नाचे उत्तर देणे आवश्यक आहे: आपल्याला 2 क्रमांक वाढवण्याची आवश्यकता कोणत्या शक्तीवर आहे जेणेकरून परिणाम तपासल्या जाणार्‍या घटकांच्या संख्येपेक्षा मोठा किंवा समान असेल? 10,000 साठी, ही 14 वी शक्ती आहे. 2 ते 13 वी घात खूपच लहान आहे (8192), परंतु 2 ची 14 वी घात = 16384, आणि ही संख्या आमच्या स्थितीचे समाधान करते (ते अॅरेमधील घटकांच्या संख्येपेक्षा मोठे किंवा समान आहे). आम्हाला लॉगरिदम सापडला: 14. आम्हाला किती तुलनांची आवश्यकता असू शकते! :) अल्गोरिदम आणि अल्गोरिदम जटिलता हा विषय एका धड्यात बसण्यासाठी खूप विस्तृत आहे. परंतु हे जाणून घेणे खूप महत्वाचे आहे: अनेक नोकरीच्या मुलाखतींमध्ये अल्गोरिदमचा समावेश असलेले प्रश्न असतील. सिद्धांतासाठी, मी तुमच्यासाठी काही पुस्तकांची शिफारस करू शकतो. तुम्ही " ग्रोकिंग अल्गोरिदम " सह प्रारंभ करू शकता. या पुस्तकातील उदाहरणे पायथनमध्ये लिहिलेली आहेत, परंतु पुस्तकात अतिशय सोपी भाषा आणि उदाहरणे वापरली आहेत. नवशिक्यासाठी हा सर्वोत्तम पर्याय आहे आणि आणखी काय, तो फार मोठा नाही. अधिक गंभीर वाचनापैकी, आमच्याकडे रॉबर्ट लाफोर आणि रॉबर्ट सेजविक यांची पुस्तके आहेत. दोन्ही जावामध्ये लिहिलेले आहेत, जे तुमच्यासाठी शिकणे थोडे सोपे करेल. शेवटी, आपण या भाषेशी परिचित आहात! :) उत्तम गणित कौशल्य असलेल्या विद्यार्थ्यांसाठी, थॉमस कॉर्मेनचे पुस्तक हा सर्वोत्तम पर्याय आहे . पण एकट्या सिद्धांताने पोट भरणार नाही! ज्ञान != क्षमता . तुम्ही HackerRank आणि LeetCode वर अल्गोरिदमचा समावेश असलेल्या समस्या सोडवण्याचा सराव करू शकता . या वेबसाइटवरील कार्ये अनेकदा Google आणि Facebook वरील मुलाखती दरम्यान देखील वापरली जातात, त्यामुळे तुम्हाला निश्चितपणे कंटाळा येणार नाही :) या धड्याच्या सामग्रीला बळकट करण्यासाठी, मी शिफारस करतो की तुम्ही YouTube वर मोठ्या O नोटेशनबद्दल हा उत्कृष्ट व्हिडिओ पहा. पुढील धड्यांमध्ये भेटू! :)
टिप्पण्या
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION