क्या इंडस्ट्री में काम करते समय बिग-ओ वाकई इतना प्रासंगिक है?


65

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

उद्योग में विकास के लिए बड़ा-ओ विश्लेषण कितना प्रासंगिक है? कितनी बार आप वास्तव में इसका उपयोग करते हैं, और समस्या के लिए एक सम्मानित मानसिकता रखना कितना आवश्यक है?


5
@ MM01 मैंने हाई स्कूल और विश्वविद्यालय में इसका अध्ययन किया है। हालाँकि मैं इसे प्रोग्रामर नॉलेज के बिल्डिंग ब्लॉक के रूप में पहचानता हूँ, फिर भी मैंने इसे अपनी किसी भी नौकरी में इस्तेमाल नहीं किया।
12p पर systempuntoout

27
क्या सटीक जब यह पूछ आप इस उद्योग पर विचार कर रहे हैं? क्या आप चंद्र रोवर, या ब्लॉगिंग प्लेटफ़ॉर्म के लिए नियंत्रण कोड लिख रहे हैं?
टिम पोस्ट

14
@systempuntoout, आपने कभी नहीं, कभी एक एल्गोरिथ्म चुना जो तेजी से एक और की तुलना में तेज था?

3
@ MM01 - आप, सबसे आसान से एक स्पष्टीकरण (सरलीकृत अधिक यद्यपि) यह के साथ संघर्ष कर रहे हैं, तो यहां देख सकते हैं: rob-bell.net/2009/06/a-beginners-guide-to-big-o-notation
टिम पोस्ट

6
@ सिस्टमप्रोटेक्टआउट, ओ-नोटेशन को समझना और उपयोग करना गणितीय प्रमाण को कठोर नहीं करता है, लेकिन एक सरल अभिव्यक्ति में बता सकता है कि आपका एल्गोरिदम कैसे व्यवहार करता है। यदि आपको 1 डी में छंटनी की आवश्यकता है तो आप एक ओ (एन लॉग एन) एल्गोरिदम चाहते हैं। यदि आप एक Fibbonacci-number कार्यान्वयन चाहते हैं, तो आप O (n) में चलने वाले को चुनें। यहां तक ​​कि अगर आप स्पष्ट रूप से इसे ज़ोर से नहीं कहते हैं, तो भी यह लूप और रिकर्स की संख्या का संघनित संस्करण है जो बेहद उपयोगी है। बहुत शब्द बचाता है । (और नाइटपिक के लिए - हां, कश्मीर महत्वपूर्ण है , भले ही यह काफी बड़ा या छोटा हो)।

जवाबों:


76

मेरा सवाल यह है कि उद्योग में विकास के लिए यह परीक्षण कितना प्रासंगिक है?

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

आप कितनी बार इसका उपयोग करते हैं और समस्या के लिए एक सम्मानित मानसिकता रखना कितना आवश्यक है?

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

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


+1 क्योंकि सिद्धांत महत्वपूर्ण हैं। उद्योग के मेरे अनुभव में, इसका ध्यान रखना एक महान सौदे पर ध्यान देने योग्य बात नहीं है। उस ने कहा - यह आपको (उदाहरण) सूची सम्मिलन बनाम सरणी सम्मिलन, या बुलबुला सॉर्ट बनाम क्विकर के तुलना के बारे में पूछा जाता है, फिर साक्षात्कारकर्ता आपके ज्ञान को निर्देशित करने का लक्ष्य रखता है। और यदि आप जटिलता / रन-टाइम / स्केलेबिलिटी / प्रदर्शन के बारे में सोचते हैं, तो भी इसकी सराहना करें। अगर आप इन चीजों के बारे में नहीं सोच सकते / सकती हैं, तो कुछ ऐसे काम होंगे जो आपको नहीं पता होंगे कि अच्छा कैसे करें। दुर्लभ, लेकिन यह समय-समय पर सामने आता है।
जल्दी से 12

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

लेकिन यह भी ध्यान दें कि "रीलेली" प्रदर्शन अक्सर उन मुद्दों से प्रभावित होता है जिनका जटिलता से कोई लेना-देना नहीं है, लेकिन आपके नियंत्रण से बाहर काले बक्से के साथ। उन बक्सों का एक मानसिक मॉडल किसी भी चीज को अनुकूलित करने के लिए जरूरी है। ये विचार संभवत: अमान्य हो जाते हैं क्योंकि एन अनंत तक पहुंचता है, जो कभी भी ईर्ष्या नहीं करता है।
डॉ। बेलिसियस

@ टिम पोस्ट - मैंने कहा "... लगातार स्केलेबल सिस्टम लागू करें ..."। यकीन है कि आप भाग्यशाली हो सकते हैं, लेकिन आप लगातार भाग्यशाली नहीं हो सकते। लेकिन मैं यह मानने के लिए भी तैयार हूं कि वास्तव में स्मार्ट / अनुभवी व्यक्ति किसी पाठ्य पुस्तक या कंप्यूटर साइंस कोर्स के बिना कहीं भी जाकर जटिलता की सहज समझ विकसित कर सकता है
स्टीफन C

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

36

इसका कारण यह है क्योंकि यह स्केलेबिलिटी को इंगित करता है

एक प्रक्रिया जो O (n ^ 2) है, वह O (n log n) है, लेकिन O (n ^ 3) या O (n!) में एक से बेहतर है।

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


EDIT: http://www.nodinghorror.com/blog/2007/09/everything-is-fast-for-small-n.html (जो बदले में प्रोग्रामिंग मोती से है) से n ^ 3 के साथ 48n की तुलना

यहाँ छवि विवरण दर्ज करें


8
+1: आपकी प्रक्रिया का पता लगाने का सबसे खराब तरीका यह है कि ग्राहकों को एक ही बार में चिल्लाते हुए दिखाने का एक समूह हो।
लैरी कोलमैन

22
@ लॉरी, कम से कम चीखें ग्राहकों की संख्या के साथ रैखिक रूप से!

10
खैर, मुझे लगता है कि बस पता चलता है कि कितना बड़ा ओ-ओ है: ध्वनि वास्तव में O(log Customers)डीबी है।
13

4
@MSalters, ठीक है, मैं ठीक किया मानी: " संख्या चिल्लाती के ग्राहकों की संख्या के साथ रैखिक पैमाने"। ध्वनि स्तर एक अलग मामला है।

1
@ Thorbjørn Ravn Andersen: मैंने कुछ अध्ययनों को पढ़ा है कि इसका मतलब यह है कि यह एक लघुगणकीय पैमाने पर अधिक है, यही वजह है कि ग्राहक शिकायतों के कुछ वर्ग इतने महत्वपूर्ण हैं! वे संकेत करते हैं कि, ग्राहक आधार जितना बड़ा होता है, कई और लोगों को वह समस्या होती है, और बस कुछ भी नहीं कह रहे हैं या प्रतियोगिता में नहीं जा रहे हैं।
स्टीवन एवर्स

32

यह इस बात पर निर्भर करता है कि आप क्या कर रहे हैं।

वेब डेवलपर्स (जैसे कि मेरे लिए) यह आमतौर पर बहुत मायने रखता है। आप वेब ऐप्स को स्केल करना चाहते हैं। यदि आपके ऐप में एक अड़चन है जो O (n ^ 2) के साथ है, और आपको लगता है कि यह ठीक है, क्योंकि आपका सर्वर 1000 एक साथ उपयोगकर्ताओं को संभाल सकता है, ऐसा लगता है कि आपको देखभाल की आवश्यकता नहीं है। बात यह है कि सिर्फ दो बार संभालना है (जो कि पूरी रात बस होने की संभावना है), आपको कम्प्यूटेशनल शक्ति की 4 गुना आवश्यकता होगी। आदर्श रूप से आप वेब ऐप्स को O (n) में स्केल करना चाहते हैं, क्योंकि हार्डवेयर एक समझदार स्थिर उपयोगकर्ता / सर्वर अनुपात में सस्ता है।

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

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


मोबाइल ऐप बनाना केवल जीयूआई को एक साथ फेंकने का मामला नहीं है, लेकिन मैं आपको 2010 में यह बयान देने के लिए क्षमा कर दूंगा :) मोबाइल में आर्किटेक्चर, थ्रेडिंग, डेटा स्टोरेज, नेटवर्किंग कतार में जटिलता है। लेकिन कच्चा बिग ओ अप्रासंगिक है (कम से कम आईओएस में) क्योंकि आपको मूल डेटा संरचनाओं और एल्गोरिदम का उपयोग करना चाहिए।
पोस्टकोडवाद

21

मैंने वास्तव में अपने कामकाजी जीवन में औपचारिक रूप से नियम लागू नहीं किया।

हालाँकि आपको उस अवधारणा से परिचित होना होगा, और हर बार जब आप एल्गोरिथ्म डिजाइन करते हैं, तो इसे सहज तरीके से लागू करें।

नियम है:

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


10

ठीक है, शायद एक छोटी सी कहानी आपको बताए कि यह आवश्यक क्यों है?

जिस प्रोजेक्ट में मैं काम कर रहा था, उसमें सभी तरह के डॉक्यूमेंट (लेबल, लिस्ट इत्यादि) प्रिंट करने के लिए जिम्मेदार एक प्रोग्राम था। इस प्रोग्राम में दो भाग थे, एक डेटाबेस से सभी आवश्यक डेटा को पढ़ना और इसे एक में लिखना .ini शैली की फ़ाइल, और एक अन्य भाग जो उन फ़ाइलों को पढ़ता है और इसे टेम्पलेट्स में भर देता है। इसने लेबल और छोटी सूचियों (केवल कुछ क्षेत्रों के साथ) के लिए यथोचित रूप से काम किया लेकिन यह लगभग 10 मिनट तक चला जब इसे ~ 20 पृष्ठों की "बड़ी" सूची को प्रिंट करना पड़ा। क्योंकि इन इन-फाइल्स को एक्सेस करने के परिणामस्वरूप ओ (n access) एक्सेस टाइम होता है, एन प्रिंट करने के लिए फ़ील्ड की संख्या।

यदि इस कार्यक्रम के मूल प्रोग्रामर ओ-नोटेशन को समझते थे, तो उन्होंने इसे कभी नहीं बनाया होगा। उस मूर्खता को एक हैशटेबल के साथ बदलने ने इसे बहुत तेजी से soooooooo बना दिया।


8

बिग-ओ का प्रदर्शन महत्वपूर्ण है, लेकिन इसे बड़े पैमाने पर आंतरिक रूप दिया गया है।

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

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


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

6

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

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


5

मेमो टू सेल्फ !:

मैं और कई अन्य लोग इस प्रश्न को नियमित रूप से पूछते हैं।

मुझे लगता है कि हम इसका असली कारण पूछते हैं क्योंकि हम आलसी हो गए हैं।

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

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


5

ज़रुरी नहीं। मूल रूप से केवल एक बार जब मैं इसके बारे में कभी सोचता हूं तो डेटाबेस तक पहुंचना होता है। मैं आमतौर पर कोड देखता हूं और कहता हूं "यह n + 1 प्रश्न कर रहा है, आपको इसे केवल 1 या 2 करने के लिए बदलना चाहिए"

क्योंकि मेरे सभी डेटा को डेटाबेस से पढ़ा जा रहा है और उपयोगकर्ता को दिखाया गया है, मैं उस डेटा की मात्रा को कम करने की कोशिश कर रहा हूं, जो उस बिंदु पर काम कर रहा है, जहां एक रेखीय और O (n ^ 2) के बीच का अंतर बहुत सुंदर है। नगण्य।

यदि कोई समस्या है, तो हम इसे बाद में प्रोफ़ाइल और ठीक कर देंगे।


1
मुझे वास्तव में लगता है कि यह आकस्मिक "एन + 1" प्रश्न वस्तु खतरनाक है। विशेष रूप से, मैंने कोड देखा है जिसने n ^ d क्वेरीज़ (जहाँ d> = 2) को "n + 1" के रूप में खारिज कर दिया है, जिसने वास्तव में भयानक स्थिति को केवल खराब दिखाई दिया।
फिलोसोडैड

3

आपके द्वारा लगाए गए तीन प्रश्न और मुझे लगता है कि संक्षिप्त रूप में दिए गए उत्तर अब तक दिए गए लंबे तर्कों की सहायता कर सकते हैं।

उद्योग में विकास के लिए यह परीक्षण कितना प्रासंगिक है?

उद्योग पर निर्भर करता है।

कहीं भी जहां कोड गति या कोड स्थान एक मुद्दा है, यह पूरी तरह से शामिल उद्योग के लिए प्रासंगिक है। अक्सर आपको यह जानने की जरूरत होती है कि एक रूटीन को कितना समय लगेगा, या कितनी मेमोरी (ऑन / ऑफलाइन) इसकी आवश्यकता होगी।

आप कितनी बार इसका प्रयोग करते हैं?

उद्योग पर निर्भर करता है।

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

समस्या के लिए एक सम्मानित मानसिकता होना कितना आवश्यक है?

पूरी तरह से आवश्यक है।

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


3

मैं कहूंगा कि यह बहुत अक्सर है। हम आम तौर पर साबित नहीं करते हैं कि कुछ विशेष रूप से बड़ा-ओ है, लेकिन हमने इस विचार को आंतरिक रूप दिया है, और विशेष डेटा संरचनाओं और एल्गोरिदम के लिए बड़े-ओ गारंटी से परिचित / याद किया जाता है, और हम किसी विशेष उपयोग के लिए सबसे तेज़ लेते हैं। यह एक पुस्तकालय होने में मदद करता है जो सभी विकल्पों से भरा है, जैसे जावा संग्रह पुस्तकालय, या सी ++ एसटीएल। आप परोक्ष और स्वाभाविक रूप से का उपयोग बड़े-ओ हर दिन है जब आप एक का उपयोग करने के लिए चुन java.util.HashMap( O(1)एक के बजाय देखने) java.util.TreeMap( O(lg n)देखने) और निश्चित रूप से एक भर में एक रेखीय खोज चलाने के लिए नहीं चुनने java.util.LinkedList( O(n)कुछ जहां क्रमबद्ध पहुँच की जरूरत नहीं है के लिए देखने)।

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


3

हाँ

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

मैंने दो अलग-अलग प्रणालियों पर काम किया है जो शुरुआती विकास में ठीक लग रहा था, लेकिन हार्डवेयर को उत्पादन परीक्षण में अपने घुटनों पर लाया, क्योंकि किसी ने O (n ^ 2) एल्गोरिथम का उपयोग किया था। और दोनों ही मामलों में, फिक्स O (n) एल्गोरिथ्म के लिए एक तुच्छ परिवर्तन था।


1

यह संभवतः उन जगहों पर उपयोग किया जाता है जहां वे खपत के लिए एपीआई विकसित कर रहे हैं। C ++ STL उन कुछ एपीआई में से एक है, जिनके एल्गोरिदम पर जटिलता प्रतिबंध लगाए गए हैं। लेकिन रोजमर्रा के काम करने वाले प्रोग्रामर / सीनियर प्रोग्रामर / डिजाइनर / आर्किटेक्ट के लिए यह उनके दिमाग को पार नहीं करता है।


कोई भी अच्छा संग्रह API इन गारंटियों को बनाता है, उदाहरण के लिए जावा संग्रह API के पास इसके प्रलेखन में भी ये गारंटीएँ हैं।
केन ब्लूम

1

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

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

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

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

इसलिए मेरे लिए और अधिक मायने रखता है कि कुछ लोग "माइक्रो-ऑप्टिमाइज़ेशन" कह सकते हैं, जैसे डेटा प्रतिनिधित्व (मेमोरी लेआउट, हॉट / कोल्ड फील्ड विभाजन के साथ एक्सेस पैटर्न, आदि), मल्टीथ्रेडिंग, SIMD, और कभी-कभी GPGPU। एक ऐसे क्षेत्र में जहां हर कोई पहले से ही सक्षम है कि वह हर समय प्रकाशित होने वाले नए कागजात के साथ हर चीज के लिए अत्याधुनिक एल्गोरिदम का सही उपयोग कर सके, एल्गोरिदम की जादूगरों की पिटाई में आपकी प्रतिस्पर्धात्मक बढ़त एल्गोरिदमिक जटिलता में सुधार से नहीं आती है और अधिक प्रत्यक्ष कम्प्यूटेशनल दक्षता।

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

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

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


0

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

हालांकि, यह आमतौर पर एक उचित, औपचारिक, सबूत के रूप में नहीं किया जाता है कि किसी दिए गए जटिलता में कुछ है, इसलिए ऑपरेशन के एक पैटर्न के लिए किस जटिलता का एक अच्छा अंतर्ज्ञान है, यह एक अच्छी शुरुआत है।


0

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


-3

साक्षात्कार में जो प्रश्न पूछे जाते हैं, वे यह पता लगाने के लिए हैं कि क्या आप चीजों को समझा सकते हैं और तार्किक तरीके से सोच सकते हैं । साक्षात्कारकर्ता यह भी पता लगाने की कोशिश कर रहा है कि क्या आप संबंधित समस्या को हल करने के लिए क्या जानते हैं, उसे नियोजित कर सकते हैं

हर कोई जिसने सॉफ्टवेयर इंजीनियरिंग का कोई सार्थक अध्ययन किया है वह "बिग ओ" में आया होगा, "बिग ओ" के बारे में एक अच्छे सवाल का जवाब देने के लिए आपको मानक डेटा संरचनाओं और एल्गोरिदम के बारे में भी समझना होगा।

स्टाफ के सदस्य के लिए साक्षात्कार करते समय आप किसी ऐसे व्यक्ति की तलाश कर रहे हैं जो काम को जल्दी से सीख सके, न कि कोई ऐसा जिसे पहले से ही विस्तृत कौशल का एक सेट पता हो, इसलिए ऐसे प्रश्नों को चुनना बहुत कठिन हो सकता है जो साक्षात्कारकर्ता और साक्षात्कारकर्ता दोनों की आम समझ हो का।

तो "बिग ओ" के बारे में सवाल साक्षात्कार प्रक्रिया के लिए बहुत प्रासंगिक हो सकते हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.