
हाल ही में, एक ऑनलाइन फोरम में एक सवाल पूछा गया था: एक वास्तविक प्रोग्रामर की शर्तों के तहत मांग में गणित कितना है, वह कितनी बार इसका उपयोग करता है और इसके क्षेत्र क्या हैं? और यहाँ मेरा जवाब है।
सबसे पहले, मैं, लगभग सभी प्रोग्रामर की तरह,
बूलियन तर्क का उपयोग, सशर्त बयानों और निकास मानदंडों के लिए तार्किक अभिव्यक्तियों के विश्लेषण से, ऐसे भावों को लाइन में लाने के लिए, उदाहरण के लिए,
डे मॉर्गन के कानूनों ।
पहले-क्रम के
कलन पर हमारी अधिकांश कार्य सीमाएँ पूर्वनिर्धारण, अपरिवर्तनवादियों, और अधिक के विश्लेषण के रूप में अन्य
विधेय और विधेय की भविष्यवाणी करती हैं (हालाँकि ऐसा लग सकता है कि हम कुछ अन्य कार्य कर रहे हैं)।
इसके अलावा, मैं अक्सर एल्गोरिदम की जटिलता के विश्लेषण में संलग्न होता हूं। इन दिनों संसाधित किए जा रहे डेटासेट के आयाम विशाल हैं। 2010 के एक
तकनीकी सम्मेलन में
, एरिक श्मिट ने कहा कि मानवता द्वारा बनाए गए डेटा की मात्रा आज केवल दो दिनों में दुनिया के सभी मौजूदा डेटा की मात्रा के बराबर है। इन खंडों के बड़े खंडों को संसाधित करने और उनसे लाभ प्राप्त करने में सक्षम होना मेरे लिए महत्वपूर्ण है। और इस अर्थ में, हम डेटा पर लागू होने वाले
संचालन के
अनुपात-लौकिक जटिलता को समझना, यह निर्धारित करने के लिए महत्वपूर्ण है कि क्या सिद्धांत में कुछ गणना संभव है। अधिक पारंपरिक प्रकार के
ओ-विश्लेषण या
थीटा विश्लेषण के विपरीत
, ऐसे तराजू पर लगातार कारकों का एक महत्वपूर्ण प्रभाव पड़ता है: कारक 2 एल्गोरिथ्म के स्पर्शोन्मुख समय की जटिलता को नहीं बदलता है, लेकिन प्रोसेसर की संख्या में 10 हजार से 20 हजार तक की वृद्धि की आवश्यकता होगी, और खपत में ऐसा अंतर। संसाधन मूर्त होंगे। नतीजतन, गणना अधिक परिष्कृत हो जाती है। उदाहरण: क्या मैं कुछ रैखिक गणना कर सकता हूं और इसे लघुगणक में बदल सकता हूं? क्या मेमोरी की खपत को तीन गुना कम करना संभव है? और इसी तरह।
अक्सर मुझे ऊपरी बाउंड के सबसे प्रतिकूल संस्करण की गणना करने की आवश्यकता होती है, कहते हैं, कुछ डेटा सेट का आकार। कई मामलों में, इस तरह की गणना nontrivial हो सकती है। या आपको
पुनरावृत्ति की गहराई बढ़ने के तरीके की जांच करने के लिए कुछ
पुनरावृत्ति सूत्र का विश्लेषण करने की आवश्यकता हो सकती है। इसके लिए, मुझे, अन्य बातों के अलावा,
पुनरावृत्ति संबंधों पर मूल प्रमेय को जानना चाहिए और
संख्या श्रृंखला के विश्लेषण के सिद्धांतों को कैसे समझना चाहिए। और यह अविश्वसनीय लग सकता है, लेकिन कभी-कभी इसका मतलब यह है कि मुझे
अभिन्न की गणना करने की आवश्यकता है (हालांकि ज्यादातर केवल
रीमैन अभिन्न हैं)। या मैं सिर्फ पुनरावर्ती संबंध को हल कर सकता हूं और समाधान की एक
सीमित संख्या प्राप्त कर सकता हूं? क्या मुझे
रैखिक बीजगणित का सहारा लेना होगा? यह
कार्य उत्पन्न करने ,
स्टर्लिंग संख्या ,
मैट्रिक्स गणना जैसी चीजों की ओर जाता है। यदि आप कंप्यूटर विज्ञान को समझने के लिए आवश्यक मूलभूत गणितीय अवधारणाओं के सेट में शामिल किए जाने के बारे में उत्सुक हैं, तो डोनाल्ड नूथ द्वारा "द आर्ट ऑफ़ प्रोग्रामिंग" या नट, रोनाल्ड ग्राहम और ओरेन पेटशनिक द्वारा "कंक्रीट गणित" के पहले खंड को देखें।
मैं डेटा को संयोजित करने, संयोजन करने और परिवर्तित करने और
कॉम्बिनेटरिक्स (संख्या की गिनती, विभिन्न आयामों में समरूपता प्राप्त करना, और अधिक) के संदर्भ में बहुत सारी बुनियादी गणना करता हूं, इसमें मुख्य रूप से मेरी मदद करें। मुझे लगता है कि इस क्षेत्र से उदाहरण स्पष्ट हैं।
मैं विशेष रूप से बड़े डेटा सेट पर संचालन में बीजीय प्रणालियों की खोज के लिए विशेष रूप से
असतत गणित का उपयोग करता हूं। क्या इस या उस संरचना को एक निश्चित
समूह या
अंगूठी के रूप में
समरूपता की मदद से प्रदर्शित करना संभव है, जो मेरे लिए अधिक स्पष्ट होगा? क्या कम तंग कनेक्शन के साथ कोई विकल्प है? क्या मैं परिवर्तन के एक सट्टा मॉडल को बनाने के लिए
समूह के लिए कुछ सेट को लागू कर सकता हूं जो तर्क को सरल करता है? क्या मैं डेटा विश्लेषण के लिए कुछ टोपोलॉजी को परिभाषित कर सकता हूं? आप आश्चर्यचकित होंगे यदि आप जानते थे कि
असतत टोपोलॉजी का उपयोग करके कितनी चीजों का वर्णन किया जा सकता है। और इससे भी कम आश्चर्य की बात होगी कि
त्रिभुज असमानता की मांग होगी।
मैं
ग्राफ सिद्धांत के साथ बहुत काम करता हूं। "वेबसाइट बनाना" - पृष्ठ पर बिल्लियों की सुंदर छवियों को रखने की न केवल क्षमता की आवश्यकता है। इस प्रक्रिया में
हाइपरलिंक के वैश्विक ग्राफ में नोड्स सम्मिलित करना भी शामिल है। एक एकल पृष्ठ जोड़ने से ग्राफ़ किनारों की संख्या में संभावित वृद्धि होती है, और यह, बदले में, एक प्रभाव हो सकता है जो प्रदर्शन, विश्लेषण, खोज इंजन रैंकिंग और अन्य विशेषताओं पर पहली नज़र में स्पष्ट नहीं है। ऐसे परिवर्तनों के परिणामों को समझने से रोचक जानकारी प्राप्त करने में मदद मिल सकती है, जैसे कि ग्राफ़ कैसे बढ़ता है। यह पता चलता है कि यह
गतिकी एक
शक्ति नियम के समान ही दर्दनाक है: वर्ल्ड वाइड वेब एक
स्केललेस नेटवर्क है । इस ग्राफ के दो नोड्स के बीच सबसे
छोटा रास्ता क्या है? यदि आप इसे एक
प्लानर या
द्विदलीय ग्राफ के रूप में प्रस्तुत करने का प्रयास करते हैं तो ऐसा नेटवर्क कैसे दिखेगा? इन संपत्तियों का अनुपालन कब संभव है, यदि निश्चित रूप से यह संभव है? लेकिन क्या होगा अगर हम दुनिया भर के वेब को एक ग्राफ के रूप में नहीं मानते हैं, बल्कि उत्तरी अमेरिका, यूरोप या एशिया के पूरे सड़क नेटवर्क को मानते हैं?
इस ज्ञान से अन्य परिणाम भी हैं। अक्सर लोग यह नहीं समझते हैं कि आधुनिक वेब पेज केवल लिंक और अन्य संसाधनों के साथ
HTML दस्तावेज नहीं हैं, लेकिन एक
ग्राफ में
पेड़-जैसी डेटा
संरचनाएं एक-दूसरे से जुड़ी हैं। उपयोगकर्ता के वेब ब्राउज़र और एक सर्वर (
AJAX जैसी तकनीकों के लिए धन्यवाद) के बीच बातचीत के कारण इन पेड़ों को अक्सर क्रॉल, संसाधित और गतिशील रूप से अपडेट किया जाता है।
एक बेहतरीन और उपयुक्त उदाहरण है
मठजैक्स । या
जीमेल । यह समझना कि वे कैसे काम करते हैं, इसमें
प्रतीकात्मक कंप्यूटिंग और पृष्ठ तत्वों के
अर्थ विश्लेषण के कुछ स्तर शामिल हैं। MathJax के लेखकों को
एक दस्तावेज के ऑब्जेक्ट मॉडल के आधार पर उत्पन्न पेड़ को पीछे हटाने में सक्षम एक प्रोग्राम लिखने की जरूरत थी, गणितीय तत्वों की खोज करना, उन्हें "
स्टोव " करना और गतिशील रूप से उन्हें नए खींचे गए तत्वों के साथ बदलना। शायद कुछ उपयोगकर्ता जो देखते हैं कि यह कैसे काम करता है, बहुत प्रभावशाली नहीं होगा, लेकिन हुड के नीचे काफी जटिल चीजें होती हैं। मुझे आमतौर पर कुछ ऐसा ही नहीं करना है (मैं फ्रंट-एंड के साथ काम नहीं करता हूं), लेकिन हर समय मैं
लिस्प में समान काम करता हूं। कृपया ध्यान दें कि प्रतीकात्मक जानकारी के गणितीय प्रसंस्करण द्वारा लिस्प को मूल रूप से तेज किया गया था: इसके मैक्रोज़ पूरी तरह से प्रतीकात्मक अभिव्यक्ति के मुद्दों को कवर करते हैं।
मैं
समय श्रृंखला के साथ बहुत काम करता हूं। यातायात या संसाधनों की खपत कैसे बदलती है? किन प्रवृत्तियों को उजागर किया जा सकता है? क्या यह या कि छलांग
मौसमी रूप से अनुरोधों या स्मृति खपत के जवाब में देरी से प्रकट
होती है ? किसी चीज
के परिवर्तन की दर अलग-अलग आयामों में इनपुट डेटा के अलग-अलग होने पर कैसे प्रतिक्रिया करती है? क्या किसी बाहरी घटना से कोई
संबंध है ?
मैं सांख्यिकीय डेटा विश्लेषण के साथ बहुत काम करता हूं, न केवल प्रदर्शन विशेषताओं को निर्धारित करने के लिए, बल्कि डेटा को इस तरह से समझने के लिए भी। सिमेंटिक मेटाडेटा (उदाहरण के लिए,
माइक्रोडाटा और
माइक्रोफ़ॉर्मेट्स ,
आरडीएफ , कुछ विशिष्ट
स्कीमा के साथ अन्य
एक्सएमएल डेटा के लिए पूर्वोक्त डोम ट्री) की खोज के अलावा, मैं
असंरचित डेटा को समझने की भी कोशिश कर रहा हूं। क्या संभावना है कि यह पाठ एक सड़क का पता है? या यह
ग्राफिक निर्देशांक है ? वह किस संदर्भ में प्रकट होता है? क्या यह
स्पैम है ? यह भी समझ में आता है? क्या यह
मार्कोव श्रृंखलाओं पर आधारित पाठ जनरेटर के परिणाम की तरह दिखता है? शायद यह कुछ प्रसिद्ध साहित्यिक कृतियों के उद्धरणों की एक श्रृंखला है? या साहित्यिक विमर्श का एक टुकड़ा? या हो सकता है कि यह एक साहित्यिक अंश वाले स्पैम के बारे में चर्चा हो? मैं अभी भी हर बार हंसता हूं कि मुझे लगता है कि एक स्पैम ईमेल विज्ञापन ड्रग्स, जो बुल्गाकोव के "मास्टर और मार्गरीटा" के टुकड़े से लिपटी है।
श्रेणी सिद्धांत । कंप्यूटर प्रोग्रामिंग भाषाओं के प्रकार मोटे तौर पर श्रेणियों के अनुरूप होते हैं, और कुछ निर्माणों को गंभीरता और सरलता से इस्तेमाल करने के लिए
मोनाड्स और
फंक्शनलर्स का उपयोग किया जा सकता है। उदाहरण के लिए, हास्केल
कार्यात्मक प्रोग्रामिंग भाषा में,
I / O के लिए और
राज्य मॉडलिंग के लिए साधुओं का उपयोग किया जाता है। सरलीकृत कार्यक्रमों के साथ काम करते समय, उन्हें काम करना आसान होता है। उनके बारे में बात करना आसान है, समझना आसान है, बदलना है और इसी तरह। प्रकारों को अक्सर तार्किक तर्क के आधार पर निर्धारित किया जा सकता है, जो
विशेष मामलों की उपस्थिति की ओर जाता है (जिसका उपयोग सामान्य तर्क समस्याओं में भी किया जा सकता है)। इस बारे में सोचें कि क्या होता है यदि आप तार्किक कार्यों को लागू करने के लिए
निष्कर्षों का उपयोग करते हैं, जैसे कि
प्रोलॉग में उपयोग किए गए,
वितरित सिस्टम में
ग्राफ़ को
बदलने के लिए।
वितरित सिस्टम हमें ग्राफ सिद्धांत पर लौटते हैं। वास्तविक दुनिया की प्रणालियों में खराबी होती है, उत्खनन करने वाले फाइबर को फाड़ते हैं, भूकंप आते हैं, ज्वालामुखी विस्फोट होते हैं और मछली पकड़ने वाले ट्रॉलर समुद्री केबल को नुकसान पहुंचाते हैं। ऐसी घटनाओं के परिणामों को समझने और उन्हें जवाब देने के सर्वोत्तम तरीकों को निर्धारित करने के लिए, नेटवर्क ग्राफ की विशेषताओं को समझना आवश्यक है। रूटिंग एल्गोरिदम और नेटवर्क विश्लेषण ऐसी चीजों से निकटता से संबंधित हैं जैसे कि एक ग्राफ में नोड्स के बीच
सबसे छोटा रास्ता खोजना ।
दिज्क्स्ट्रा एल्गोरिथ्म इसमें आपकी मदद करेगा।
और फिर भी, आप दुनिया के विभिन्न हिस्सों में स्थित डेटा केंद्रों के बीच एक बड़ी गणना से लोड कैसे वितरित कर सकते हैं? यहां आपको भौतिकी के कुछ ज्ञान की भी आवश्यकता होगी: इंटरनेट के पैमाने पर,
प्रकाश की
गति एक "अड़चन" में बदल जाती है।
गर्मी लंपटता , प्रति यूनिट क्षेत्र का
वर्तमान घनत्व और अधिक उदाहरण हैं जो प्रोग्रामर को वास्तविक दुनिया के कार्यों के साथ काम करने पर विचार करना है। क्या मुझे आइसलैंड में डेटा सेंटर होस्ट करना चाहिए? सस्ते शीतलन और भूतापीय ऊर्जा स्रोत आकर्षक स्थिति पैदा करते हैं, लेकिन उन उपयोगकर्ताओं के लिए न्यूनतम देरी के बारे में क्या हो सकता है जो इस तरह के डेटा सेंटर में उपकरण किराए पर लेने में रुचि रखते हैं? उदाहरण के लिए, आइसलैंड और लंदन, या बर्लिन और एम्स्टर्डम के बीच एक
बड़े वृत्त के चाप के साथ दूरी क्या है? यह सब गणना करना काफी सरल है, लेकिन इसके लिए कुछ गणितीय ज्ञान होना आवश्यक है। क्या हम आइसलैंड से फाइबर किसी अन्य केंद्र में भेज सकते हैं? औसत देरी क्या है? ऑपरेशन के 12 महीनों के दौरान उत्तरी सागर में एक पनडुब्बी केबल टूटने की संभावना क्या है? और 48 महीने के लिए?
बेशक,
एल्गोरिदम का
सिद्धांत, ऑटोमेटा का
सिद्धांत ,
पार्सिंग ,
औपचारिक व्याकरण ,
नियमित भाषाएं ज्ञान के सभी क्षेत्र हैं जो प्रोग्रामर लगातार व्यवहार करते हैं। मैं अक्सर पार्सिंग और
पैटर्न के मेल से काम करता हूं। वास्तविक दुनिया के डेटा के साथ काम करने में, बहुत बड़े आकार के सेट में भी ऐसे तत्व शामिल नहीं हो सकते हैं जो उपयोग करते समय
रोग-संबंधी खराब व्यवहार का कारण बन सकते हैं, उदाहरण के लिए,
तकनीकों को पीछे करना । डेटा से मिलान करने के लिए
नियमित अभिव्यक्तियों का उपयोग करते हुए, मुझे सावधान रहना चाहिए और यह सुनिश्चित करना चाहिए कि ये अभिव्यक्तियाँ
वास्तव में नियमित हैं ।
संदर्भ-मुक्त व्याकरण पार्स करने के लिए
स्टोर मेमोरी के साथ एक
मशीन का उपयोग करना (जो, वैसे, जब आप
HTTP सर्वर पर अनुरोध भेजते हैं तो हर बार होता है), मुझे यह सुनिश्चित करने की आवश्यकता है कि मैं प्रोसेसर
कॉल स्टैक को समाप्त करने से बचने के लिए पुनरावृत्ति की गहराई को सीमित करता हूं, जिसे समझने की आवश्यकता है संगणना के अंतर्निहित सिद्धांत और गणित जिस पर वे आधारित हैं।
अगर मुझे कुछ असामान्य व्याकरण के लिए अपने स्वयं के
पुनरावर्ती वंश एल्गोरिथ्म को लिखने की आवश्यकता है और यह
LALR (1) से मेल नहीं खा सकता है (इसलिए मैं सिर्फ
याक या
बायसन का उपयोग नहीं कर सकता), मुझे सावधान रहना होगा या राज्य के ढेर को प्रक्रियात्मक पुनरावृत्ति से अलग रखना होगा। अगर मैं DOM ट्री (या किसी पुनरावर्ती-परिभाषित डेटा संरचना) के आसपास जाता हूं, तो यह समझ आवश्यक है।
कुछ प्रोग्रामिंग भाषाएं इसे
प्रोग्रामर के काम में कठिनाई मानती हैं और
खंडित स्टैक का उपयोग करके इसे दरकिनार कर देती हैं। बेशक, यह बहुत अच्छा होगा अगर मैं कुछ विश्लेषण किए गए संसाधनों के अपने संग्रह को एक
फ़ंक्शन (गणितीय अर्थ में) के रूप में परिभाषित कर सकता हूं। और अगर यह किसी तरह की
लीनियर प्रोग्रामिंग ऑप्टिमाइज़ेशन समस्या को कम करता है तो यह कितना अच्छा होगा?
कृपया ध्यान दें कि उपरोक्त में से कोई भी गूढ़ ज्ञान नहीं है। यह सब कार्यों और वास्तविक दुनिया के आंकड़ों के साथ अनुभव पर आधारित है। बेशक, मैं हर दिन यह सब नहीं करता हूं, लेकिन इस ज्ञान का अधिकांश मैं नियमित रूप से लागू करता हूं, और केवल कुछ - समय-समय पर। संभवतः, अवलोकन, अनुभव और उत्तराधिकारियों की प्रक्रिया पर अधिक प्रभाव पड़ता है, जितना कि उन्हें होना चाहिए (विधर्मी मॉडल अक्सर अपूर्ण और गलत हैं)। क्या वास्तविकता और मेरे अनुमानी मॉडल के बीच औसत
त्रुटि की गणना करने के लिए मेरे पास पर्याप्त गणितीय ज्ञान है?
यह कंप्यूटर विज्ञान का सार है, साथ ही साथ वे कैसे प्रोग्रामिंग और आधुनिक कंप्यूटिंग की वास्तविकताओं के साथ बातचीत करते हैं। एक आईटी पेशेवर होना कंप्यूटर सिद्धांत के क्षेत्र में एक विशेषज्ञ होने के रूप में समान नहीं है, और कई सही रूप में इंगित करते हैं, ऐसा विशेषज्ञ एक विशेषज्ञ कारीगर की तुलना में एक लागू गणितज्ञ के बहुत करीब है। किसी भी मामले में मैं ऐसे पेशेवरों के महत्व को कम नहीं करना चाहता, क्योंकि वे उपयोगी हैं और सार्वभौमिक रूप से सम्मानित हैं, लेकिन मैं सिर्फ यह ध्यान देना चाहता हूं कि कंप्यूटर विज्ञान कुछ और है।
(वैसे, मैं खुद कंप्यूटर विज्ञान का विशेषज्ञ नहीं हूं। मैंने शुद्ध गणित का अध्ययन किया, और मेरा पेशेवर पेशा इंजीनियरिंग के बहुत करीब है।)
