एक कुशल एल्गोरिथम क्या है?


10

स्पर्शोन्मुख व्यवहार के दृष्टिकोण से, "कुशल" एल्गोरिथ्म क्या माना जाता है? उस बिंदु पर रेखा खींचने के लिए मानक / कारण क्या है? व्यक्तिगत रूप से, मुझे लगता है कि जो कुछ भी मैं भोलेपन से "उप-बहुपद" कह सकता हूं, ऐसाf(n)=o(n2) जैसे कि n1+ϵ कुशल होगा और जो भी होगा Ω(n2)"अक्षम" होगा। हालाँकि, मैंने कुछ भी सुना है जो किसी भी बहुपद के आदेश को कुशल कहा जाता है। क्या तर्क है?


जवाबों:


11

वह संदर्भ पर निर्भर करता है। सैद्धांतिक कंप्यूटर विज्ञान में, आमतौर पर प्रत्येक बहुपद समय एल्गोरिथ्म को 'कुशल' माना जाता है। उदाहरण के लिए अनुमानित एल्गोरिदम में एक क्रम चलता हैn1/ϵ1/ϵ कुशल माना जाएगा, भले ही यह व्यवहार में किसी भी उचित मूल्य के लिए उपयोग करने योग्य नहीं होगा ϵ। सैट के लिए एक एल्गोरिथ्म जो अंदर चलता हैn2100 एक अद्भुत सफलता होगी।

क्लासिक एल्गोरिथ्म में, अर्थात् 80 के दशक से पहले और नीचे के रनटाइम्स n3या तो (मैट्रिक्स गुणन, न्यूनतम लागत मिलान, प्रवाह, रैखिक प्रोग्रामिंग) को कुशल मानें। वे अभी भी ज्यादातर लोगों द्वारा कुशल माने जाते हैं, मैं कहूंगा। बेशक एn2 एल्गोरिथ्म कुशल नहीं माना जाता है अगर ए nlogn एल्गोरिथ्म को जाना जाता है, उदाहरण के लिए छंटाई के लिए।

आजकल सबलाइनर एल्गोरिदम या स्ट्रीमिंग एल्गोरिदम की ओर एक रुझान है जो डेटा के टेराबाइट्स से निपटने में सक्षम हैं। Google के सूचकांक में सभी पृष्ठों की पेज रैंक की गणना करने के लिए मैट्रिक्स गुणा का उपयोग करने का प्रयास करें। यह काम नहीं करेगा।

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


9
संक्षेप में: कुशल वह है जो आपकी समस्या को उस समय सीमा में हल करता है जो आपको सूट करता है।
राफेल

यह वास्तव में अपने स्वयं के उत्तर की आवश्यकता नहीं है, लेकिन BPP, जो बहुपद क्रम के साथ कार्यों का वर्ग है (जैसा कि उत्तर में वर्णित है) यादृच्छिकता के साथ, अक्सर कुशल माना जाता है। दूसरे शब्दों में, उपरोक्त सही है, लेकिन कंप्यूटरों को आम तौर पर गणना करने के लिए यादृच्छिकता तक पहुंचने की अनुमति दी जाती है। यादृच्छिकता के सबसे महत्वपूर्ण व्यावहारिक उपयोगों में से एक हैशिंग।
सैमएम

शायद "कुशल" वास्तव में पहली जगह में सही शब्दावली नहीं है? मैं बस अपनी पथरी किताबों में से एक की समीक्षा कर रहा था, और लेखक बहुपद रनटाइम्स को "ट्रैक्टेबल" और घातीय रनटाइम को "अट्रैक्टिव" कहता है।
रॉबर्ट एस। बार्न्स

1
@ रॉबर्ट्स.बर्नेस: अलग शब्द, एक ही समस्या।
राफेल

4

वितरित एल्गोरिदम के कोण से मेरे 2 सेंट: बड़े पैमाने पर नेटवर्क (पी 2 पी, सोशल नेटवर्क, आदि) को देखते समय एक वितरित एल्गोरिथ्म को कुशल माना जाता है यदि इसका चलने का समय हैO(logcn) कुछ निरंतर के लिए c>0 और एल्गोरिथ्म के संदेशों का उपयोग करता हैO(logn)बिट्स। ध्यान दें कि संदेश के आकार की आवश्यकता को आम तौर पर चलने के समय से भी अधिक महत्व दिया जाता है, विशेष रूप से "वैश्विक" समस्याओं के लिए जो चल रहे समय पर बड़ी कम होती हैं, जैसे वितरित एमएसटी।


3

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

बेशक, कोई यह नहीं कहेगा कि बहुपद की जटिलता के साथ एक एल्गोरिथ्म, उदाहरण के लिए, O(n2000) "कुशल" है, लेकिन अधिकांश एल्गोरिदम शायद ही कभी की जटिलता से अधिक हो O(n5)

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


3

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

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


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

बहुपद runtimes के लिए, "कुशल" सिर्फ एक शब्द है, और उस पर एक भ्रामक है।
राफेल

@ राफेल शायद ट्रैडीबल एक बेहतर शब्द है जिसका उपयोग किया जा सकता है ...?
रॉबर्ट एस। बार्न्स

1
@ RobertS.Barnes: ज्यादा बेहतर नहीं, imho। "ट्रैक्टेबल" हर बिट के रूप में "कुशल" के रूप में सापेक्ष है।
राफेल

0

कुछ समस्याएं आसान हैं, कुछ कठिन हैं। क्या एल्गोरिथ्म "कुशल" है, यह निर्भर करता है कि समस्या की अंतर्निहित जटिलता की तुलना में यह कितना अच्छा है। यदि आप एक एल्गोरिथ्म पाते हैं जो O में किसी भी अंक का कारक है (n3) संचालन, और मुझे एक एल्गोरिथ्म मिलता है जो O में n संख्या को सॉर्ट करता है (n2) संचालन, तो आपका एल्गोरिथ्म अधिक कुशल है (क्योंकि यह मानव जाति के लिए ज्ञात किसी भी चीज को एक विशाल कारक द्वारा धड़कता है, जबकि मेरा उतना ही धीमा है जितना आप एक पूर्ण शुरुआत से उम्मीद करेंगे)।


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