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