चयन एल्गोरिथ्म: Difference between revisions
No edit summary |
No edit summary |
||
Line 2: | Line 2: | ||
{{for|अनुवांशिक एल्गोरिदम में कृत्रिम प्राकृतिक चयन|चयन (आनुवंशिक एल्गोरिथम)}} | {{for|अनुवांशिक एल्गोरिदम में कृत्रिम प्राकृतिक चयन|चयन (आनुवंशिक एल्गोरिथम)}} | ||
{{more footnotes|date=जुलाई 2017}} | {{more footnotes|date=जुलाई 2017}} | ||
[[ कंप्यूटर विज्ञान |'''''कंप्यूटर विज्ञान''''']] '''''में''''', एक चयन एल्गोरिदम की [[सूची (सार डेटा प्रकार)|सूची]] या | [[ कंप्यूटर विज्ञान |'''''कंप्यूटर विज्ञान''''']] '''''में''''', एक चयन एल्गोरिदम की [[सूची (सार डेटा प्रकार)|सूची]] या सारणी में kth सबसे छोटी संख्या खोजने के लिए एल्गोरिदम है। इस तरह की संख्या को kth ''[[ order statistic |क्रम सांख्यिकी]]'' कहा जाता है। इसमें [[ न्यूनतम |न्यूनतम]], अधिकतम और माध्यमिक तत्वों को खोजने की परिस्थिति सम्मिलित होती हैं। O(''n'')-time (सबसे खराब स्थिति का रैखिक समय) अधिकतम एल्गोरिदम हैं, तथा संरचित डेटा के लिए उपरेखीय प्रदर्शन संभव होता है। अत्यन्त O(1) वर्गीकृत किए गए डेटा की एक सरणी के लिए, चयनित अधिक जटिल समस्याओं जैसे [[निकटतम पड़ोसी समस्या|निकटतम पास की]] और सबसे छोटी पथ समस्याओं की उप-समस्या है। कई चयनित एल्गोरिदम एक [[ छँटाई एल्गोरिथ्म |वर्गीकरण एल्गोरिथ्म]] को सामान्यीकृत करके व्युत्पन्न किए जाते हैं, और इसके विपरीत कुछ वर्गिकरण एल्गोरिदम चयन के बार-बार आवेदन के रूप में प्राप्त किए जा सकते हैं। | ||
चयन [[ कलन विधि |एल्गोरिदम]] सबसे सरल स्थिति सूची के माध्यम से पुनरावृति करके न्यूनतम या अधिकतम तत्व ढूंढ रहा है, चल रहे न्यूनतम का ट्रैक रखते हुए - अब तक का न्यूनतम या अधिकतम और चयन प्रकार संबंधित के रूप में देखा जा सकता है। इसके विपरीत चयन एल्गोरिथ्म का सबसे जटिल परिस्थिति माध्यिका को खोज रहा है। वास्तव में एक विशेष मध्य-चयन एल्गोरिदम का उपयोग सामान्य चयन एल्गोरिदम बनाने के लिए किया जा सकता है, जैसा कि मध्यस्थों के मध्य में होता है। सबसे प्रसिद्ध चयन एल्गोरिथम [[ तुरंत चयन | शीघ्र चयन]] है, जो [[ जल्दी से सुलझाएं |शीघ्र वर्गीकरण]] से संबंधित होता है। शीघ्र वर्गीकरण, इसका असम्बद्ध रूप से सर्वोत्तम औसत प्रदर्शन है, लेकिन सबसे खराब स्थिति वाला प्रदर्शन खराब है, हालांकि इसे सर्वोत्तम सबसे खराब प्रदर्शन देने के लिए संशोधित किया जा सकता है। | चयन [[ कलन विधि |एल्गोरिदम]] सबसे सरल स्थिति सूची के माध्यम से पुनरावृति करके न्यूनतम या अधिकतम तत्व ढूंढ रहा है, चल रहे न्यूनतम का ट्रैक रखते हुए - अब तक का न्यूनतम या अधिकतम और चयन प्रकार संबंधित के रूप में देखा जा सकता है। इसके विपरीत चयन एल्गोरिथ्म का सबसे जटिल परिस्थिति माध्यिका को खोज रहा है। वास्तव में एक विशेष मध्य-चयन एल्गोरिदम का उपयोग सामान्य चयन एल्गोरिदम बनाने के लिए किया जा सकता है, जैसा कि मध्यस्थों के मध्य में होता है। सबसे प्रसिद्ध चयन एल्गोरिथम [[ तुरंत चयन | शीघ्र चयन]] है, जो [[ जल्दी से सुलझाएं |शीघ्र वर्गीकरण]] से संबंधित होता है। शीघ्र वर्गीकरण, इसका असम्बद्ध रूप से सर्वोत्तम औसत प्रदर्शन है, लेकिन सबसे खराब स्थिति वाला प्रदर्शन खराब है, हालांकि इसे सर्वोत्तम सबसे खराब प्रदर्शन देने के लिए संशोधित किया जा सकता है। | ||
== वर्गीकरण करके चयन == | == वर्गीकरण करके चयन == | ||
सूची या सरणी को क्रमबद्ध करके वांछित तत्व का चयन करके, चयन को क्रमबद्ध करने के लिए [[ कमी (जटिलता) |कम]] किया जा सकता है। यह विधि एकल तत्व का चयन करने के लिए अप्रभावी है, लेकिन कुशल है जब एक सरणी से कई चयन किए जाने की आवश्यकता होती है, तो इस स्थिति में केवल एक प्रारंभिक बहुमूल्य प्रकार की आवश्यकता होती है, जिसके बाद कई सुलभ चयन संचालन होते हैं। O(1) सरणी के लिए, हालांकि चयन एक लिंक की गई सूची में O(''n'') है, युग्म क्रमबद्ध यादृच्छिक पहुंच की कमी के कारण सामान्य रूप से वर्गीकरण के लिए O(n log n) time की आवश्यकता होती है, जहां n सूची की लंबाई है, हालांकि [[ आपको कामयाबी मिले |मूलांक वर्गीकरण]] और [[ गिनती का प्रकार ]] जैसे गैर-तुलनात्मक वर्गीकरण एल्गोरिदम के साथ निम्न परिबंध संभव है। | सूची या सरणी को क्रमबद्ध करके वांछित तत्व का चयन करके, चयन को क्रमबद्ध करने के लिए [[ कमी (जटिलता) |कम]] किया जा सकता है। यह विधि एकल तत्व का चयन करने के लिए अप्रभावी है, लेकिन कुशल है जब एक सरणी से कई चयन किए जाने की आवश्यकता होती है, तो इस स्थिति में केवल एक प्रारंभिक बहुमूल्य प्रकार की आवश्यकता होती है, जिसके बाद कई सुलभ चयन संचालन होते हैं। O(1) सरणी के लिए, हालांकि चयन एक लिंक की गई सूची में O(''n'') है, युग्म क्रमबद्ध यादृच्छिक पहुंच की कमी के कारण सामान्य रूप से वर्गीकरण के लिए O(n log n) time की आवश्यकता होती है, जहां n सूची की लंबाई है, हालांकि [[ आपको कामयाबी मिले |मूलांक वर्गीकरण]] और [[ गिनती का प्रकार ]] जैसे गैर-तुलनात्मक वर्गीकरण एल्गोरिदम के साथ निम्न परिबंध संभव होता है। | ||
पूरी सूची या सरणी को क्रमबद्ध करने के अतिरिक्त k सबसे छोटे या k सबसे बड़े तत्वों का चयन करने के लिए [[ आंशिक छँटाई |आंशिक वर्गीकरण]] का उपयोग कर सकते हैं। k वें सबसे छोटा (resp., k वें सबसे बड़ा तत्व) तब आंशिक रूप से क्रमबद्ध सूची का सबसे बड़ा (resp., सबसे छोटा तत्व) होता है तो इसके बाद किसी सरणी में पहुँचने के लिए O(1) लगता है तथा किसी सूची में पहुँचने के लिए O(k) | पूरी सूची या सरणी को क्रमबद्ध करने के अतिरिक्त k सबसे छोटे या k सबसे बड़े तत्वों का चयन करने के लिए [[ आंशिक छँटाई |आंशिक वर्गीकरण]] का उपयोग कर सकते हैं। k वें सबसे छोटा (resp., k वें सबसे बड़ा तत्व) तब आंशिक रूप से क्रमबद्ध सूची का सबसे बड़ा (resp., सबसे छोटा तत्व) होता है, तो इसके बाद किसी सरणी में पहुँचने के लिए O(1) लगता है तथा किसी सूची में पहुँचने के लिए O(k) ग्रहण करता है। | ||
=== अनियंत्रित आंशिक वर्गीकरण === | === अनियंत्रित आंशिक वर्गीकरण === | ||
Line 18: | Line 18: | ||
इस प्रकार अनियंत्रित आंशिक वर्गीकरण (न्यूनतम k तत्व, लेकिन आदेशित नहीं) और k वें तत्व का चयन बहुत समान समस्याएँ होती हैं। न केवल उनके पास समान स्पर्शोन्मुख जटिलता है, O(n), लेकिन दोनों में से किसी एक के समाधान को सीधा एल्गोरिथ्म द्वारा दूसरे के समाधान में परिवर्तित किया जा सकता है। अधिकतम k तत्व ढूँढना या k वें तत्व के मान के वर्गीकरण के नीचे सूची के तत्वों को फ़िल्टर करना होता है। | इस प्रकार अनियंत्रित आंशिक वर्गीकरण (न्यूनतम k तत्व, लेकिन आदेशित नहीं) और k वें तत्व का चयन बहुत समान समस्याएँ होती हैं। न केवल उनके पास समान स्पर्शोन्मुख जटिलता है, O(n), लेकिन दोनों में से किसी एक के समाधान को सीधा एल्गोरिथ्म द्वारा दूसरे के समाधान में परिवर्तित किया जा सकता है। अधिकतम k तत्व ढूँढना या k वें तत्व के मान के वर्गीकरण के नीचे सूची के तत्वों को फ़िल्टर करना होता है। | ||
=== आंशिक चयन प्रकार === | === आंशिक चयन का प्रकार === | ||
आंशिक वर्गीकरण द्वारा चयन का एक सरल उदाहरण आंशिक चयन वर्गीकरण का उपयोग करना है। | आंशिक वर्गीकरण द्वारा चयन का एक सरल उदाहरण आंशिक चयन वर्गीकरण का उपयोग करना है। | ||
Line 44: | Line 44: | ||
=== महत्वपूर्ण योजना के रूप में मध्यस्थ चयन === | === महत्वपूर्ण योजना के रूप में मध्यस्थ चयन === | ||
{{further|मध्यस्थ की माध्यिका}} | {{further|मध्यस्थ की माध्यिका}} | ||
एक माध्य-चयन एल्गोरिथम का उपयोग एक सामान्य चयन एल्गोरिथम या वर्गीकरण एल्गोरिथम प्राप्त करने के लिए किया जा सकता है, इसे शीघ्र चयन या शीघ्र वर्गीकरण में महत्वपूर्ण योजना के रूप में लागू करके, मध्य-चयन एल्गोरिथम मे असम्बद्ध रूप से सर्वोत्तम | एक माध्य-चयन एल्गोरिथम का उपयोग एक सामान्य चयन एल्गोरिथम या वर्गीकरण एल्गोरिथम प्राप्त करने के लिए किया जा सकता है, इसे शीघ्र चयन या शीघ्र वर्गीकरण में महत्वपूर्ण योजना के रूप में लागू करके, मध्य-चयन एल्गोरिथम मे असम्बद्ध रूप से सर्वोत्तम रैखिक-समय होता है, तो परिणामी चयन या वर्गीकरण एल्गोरिथम भी होते है। वास्तव में एक सटीक माध्यिका आवश्यक नहीं है - एक सन्निकट माध्यिका पर्याप्त होती है। माध्यिका चयन एल्गोरिथम के माध्यिका में, महत्वपूर्ण योजना एक अनुमानित माध्यिका की गणना करती है, जो इसे आधार के रूप में उपयोग करती है, इस आधार की गणना करने के लिए एक छोटे समुच्चय पर पुनरावर्ती होती है। व्यवहार में धुरी अभिकलन भूमि के ऊपर महत्वपूर्ण होता है, इसलिए इन एल्गोरिदम का सामान्य रूप से उपयोग नहीं किया जाता है, लेकिन यह तकनीक चयन और वर्गीकरण एल्गोरिदम से संबंधित सैद्धांतिक रुचि की है। | ||
विस्तार से एक माध्यिका-चयन एल्गोरिथम दिया गया है, कोई इसे चयन एल्गोरिथम प्राप्त करने के लिए शीघ्र चयन में महत्वपूर्ण योजना के रूप में उपयोग कर सकता है। यदि माध्य-चयन एल्गोरिथम सर्वोत्तम होती है, तो जिसका अर्थ है O(n), परिणामी सामान्य चयन एल्गोरिथम भी सर्वोत्तम है, जिसका अर्थ फिर से रैखिक है। ऐसा इसलिए होता है क्योंकि शीघ्र चयन एक विभाजन और जीत एल्गोरिथ्म है, तथा प्रत्येक धुरी पर माध्यिका का उपयोग करने का अर्थ है, कि प्रत्येक चरण पर खोज | विस्तार से एक माध्यिका-चयन एल्गोरिथम दिया गया है, कोई इसे चयन एल्गोरिथम प्राप्त करने के लिए शीघ्र चयन में महत्वपूर्ण योजना के रूप में उपयोग कर सकता है। यदि माध्य-चयन एल्गोरिथम सर्वोत्तम होती है, तो जिसका अर्थ है कि O(n), परिणामी सामान्य चयन एल्गोरिथम भी सर्वोत्तम है, जिसका अर्थ फिर से रैखिक है। ऐसा इसलिए होता है क्योंकि शीघ्र चयन एक विभाजन और जीत एल्गोरिथ्म होता है, तथा प्रत्येक धुरी पर माध्यिका का उपयोग करने का अर्थ है, कि प्रत्येक चरण पर खोज समुच्चय आकार में आधे से कम हो जाता है, इसलिए समग्र जटिलता एक ज्यामितीय श्रृंखला है, जो प्रत्येक चरण की जटिलता होती है, और इस प्रकार बस एक चरण की जटिलता का निरंतर गुणा, वास्तव में <math>2 = 1/(1-(1/2))</math> बार श्रृंखला का योग करें। | ||
इसी तरह माध्यिका-चयन एल्गोरिथम या माध्यिका खोजने के लिए लागू सामान्य चयन एल्गोरिथम दिया गया है, कोई इसे वर्गीकरण एल्गोरिथम प्राप्त करने के लिए शीघ्र वर्गीकरण में एक महत्वपूर्ण योजना के रूप में उपयोग कर सकता है। यदि चयन एल्गोरिथ्म सर्वोत्तम है, जिसका अर्थ है कि O(n), परिणामी वर्गीकरण एल्गोरिथ्म सर्वोत्तम है, जिसका अर्थ है O(n log n)। माध्यिका वर्गीकरण के लिए सबसे अच्छी धुरी है, क्योंकि यह समान रूप से डेटा को विभाजित करती है, और इस प्रकार सर्वोत्तम वर्गीकरण | इसी तरह माध्यिका-चयन एल्गोरिथम या माध्यिका खोजने के लिए लागू सामान्य चयन एल्गोरिथम दिया गया है, कोई इसे वर्गीकरण एल्गोरिथम प्राप्त करने के लिए शीघ्र वर्गीकरण में एक महत्वपूर्ण योजना के रूप में उपयोग कर सकता है। यदि चयन एल्गोरिथ्म सर्वोत्तम है, जिसका अर्थ है कि O(n), परिणामी वर्गीकरण एल्गोरिथ्म सर्वोत्तम है, जिसका अर्थ है O(n log n)। माध्यिका वर्गीकरण के लिए सबसे अच्छी धुरी है, क्योंकि यह समान रूप से डेटा को विभाजित करती है, और इस प्रकार सर्वोत्तम वर्गीकरण का दायित्व देती है, यह मानते हुए कि चयन एल्गोरिथ्म सर्वोत्तम है। शीघ्र वर्गीकरण में महत्वपूर्ण योजना अनुमानित माध्य का उपयोग करते हुए, मध्यस्थ की माध्यिका के लिए एक वर्गीकरण एनालॉग उपस्थित होते है, और इसी तरह एक सर्वोत्तम शीघ्र वर्गीकरण उत्पन्न करता है। | ||
== चयन द्वारा वृद्धिशील वर्गीकरण == | == चयन द्वारा वृद्धिशील वर्गीकरण == | ||
वर्गीकरण द्वारा चयन के विपरीत बार-बार चयन द्वारा क्रमिक रूप से क्रमबद्ध किया जा सकता है। संक्षेप में चयन केवल एक तत्व k वें तत्व उत्पन्न करता है। हालांकि, व्यावहारिक चयन एल्गोरिदम में अधिकांश आंशिक वर्गीकरण सम्मिलित होता है, ऐसा करने के लिए इसको संशोधित भी किया जा सकता है। आंशिक वर्गीकरण द्वारा चयन स्वाभाविक रूप से ऐसा करता है, तत्वों को k तक क्रमबद्ध करना और विभाजन द्वारा चयन करना भी कुछ तत्वों को क्रमबद्ध करता है। पिवोट्स को सही स्थिति में क्रमबद्ध किया जाता है, जिसमें kth तत्व अंतिम केंद्र होता है, और पिवोट्स के बीच के तत्वों का मान होता है धुरी मानो के बीच विभाजन-आधारित चयन और विभाजन-आधारित वर्गीकरण के बीच का अंतर जैसा कि शीघ्र चयन बनाम शीघ्र वर्गीकरण में होता है चयन में प्रत्येक धुरी के केवल एक तरफ पुनरावृत्ति होती है, केवल पिवोट्स को वर्गीकरण करना (औसत log(''n'') पिवोट्स का उपयोग किया जाता है, धुरी के दोनों किनारों पर पुनरावर्ती होने के अतिरिक्त। | वर्गीकरण द्वारा चयन के विपरीत बार-बार चयन द्वारा क्रमिक रूप से क्रमबद्ध किया जा सकता है। संक्षेप में चयन केवल एक तत्व k वें तत्व उत्पन्न करता है। हालांकि, व्यावहारिक चयन एल्गोरिदम में अधिकांश आंशिक वर्गीकरण सम्मिलित होता है, ऐसा करने के लिए इसको संशोधित भी किया जा सकता है। आंशिक वर्गीकरण द्वारा चयन स्वाभाविक रूप से ऐसा करता है, तत्वों को k तक क्रमबद्ध करना और विभाजन द्वारा चयन करना भी कुछ तत्वों को क्रमबद्ध करता है। पिवोट्स को सही स्थिति में क्रमबद्ध किया जाता है, जिसमें kth तत्व अंतिम केंद्र होता है, और पिवोट्स के बीच के तत्वों का मान होता है धुरी मानो के बीच विभाजन-आधारित चयन और विभाजन-आधारित वर्गीकरण के बीच का अंतर जैसा कि शीघ्र चयन बनाम शीघ्र वर्गीकरण में होता है चयन में प्रत्येक धुरी के केवल एक तरफ पुनरावृत्ति होती है, केवल पिवोट्स को वर्गीकरण करना (औसत log(''n'') पिवोट्स का उपयोग किया जाता है, धुरी के दोनों किनारों पर पुनरावर्ती होने के अतिरिक्त। | ||
इसका उपयोग उसी डेटा पर बाद के चयनों को गति देने के लिए किया जा सकता | इसका उपयोग उसी डेटा पर बाद के चयनों को गति देने के लिए किया जा सकता है। तीव्र में पूरी तरह से क्रमबद्ध सरणी O(1) चयन की अनुमति देती है। इसके अतिरिक्त पहले एक पूर्ण वर्गीकरण करने की तुलना में बार-बार चयन द्वारा वृद्धिशील छँटाई कई चयनों पर वर्गीकरण लागत को परिशोधित करती है। | ||
आंशिक रूप से | आंशिक रूप से वर्गीकरण किए गए डेटा K तक के लिए, जब तक आंशिक रूप से वर्गीकृत किए गए डेटा और इंडेक्स के तक डेटा वर्गीकरण किया जाता है, तब तक रिकॉर्ड किया जाता है, k से कम या उसके बराबर j के बाद के चयन केवल jth तत्व का चयन कर सकते हैं, क्योंकि यह पहले से ही वर्गीकरण किया गया है, जबकि k से अधिक j के चयनों को केवल kth स्थिति से ऊपर के तत्वों को वर्गीकृत करने की आवश्यकता है | ||
विभाजित डेटा के लिए, यदि पिवोट्स की सूची संग्रहीत की जाती है (उदाहरण के लिए, सूचकांकों की एक क्रमबद्ध सूची में), तो बाद के चयनों को केवल दो पिवोट्स (नीचे और ऊपर | विभाजित डेटा के लिए, यदि पिवोट्स की सूची संग्रहीत की जाती है (उदाहरण के लिए, सूचकांकों की एक क्रमबद्ध सूची में), तो बाद के चयनों को केवल दो पिवोट्स (निकटतम पिवोट्स नीचे और ऊपर) के बीच अंतराल में चयन करने की आवश्यकता होती है। सबसे बड़ा लाभ शीर्ष-स्तर के पिवोट्स से है, जो महंगे बड़े विभाजनों को समाप्त करते हैं। डेटा के मध्य के पास एक एकल पिवट (धुरी) भविष्य के चयनों के लिए आधे समय में कटौती करता है। पिवट सूची बाद के चयनों में बढ़ेगी, क्योंकि डेटा अधिक क्रमबद्ध हो जाता है, और एक पूर्ण वर्गीकृत के आधार के रूप में विभाजन-आधारित वर्गीकृत में भी पास किया जा सकता है। | ||
== | == उप-रेखीय समय में चयन करने के लिए डेटा संरचनाओं का उपयोग करना == | ||
डेटा की एक असंगठित सूची को देखते हुए, न्यूनतम तत्व को खोजने के लिए रैखिक समय (Ω(n)) की आवश्यकता होती है, क्योंकि हमें प्रत्येक तत्व की जांच करनी होती है (अन्यथा, हम इसे याद कर सकते हैं)। यदि हम सूची को व्यवस्थित करते हैं, उदाहरण के लिए इसे | डेटा की एक असंगठित सूची को देखते हुए, न्यूनतम तत्व को खोजने के लिए रैखिक समय (Ω(n)) की आवश्यकता होती है, क्योंकि हमें प्रत्येक तत्व की जांच करनी होती है (अन्यथा, हम इसे याद कर सकते हैं)। यदि हम सूची को व्यवस्थित करते हैं, उदाहरण के लिए इसे प्रत्येक समय क्रमबद्ध करके रखते हैं, तो kth सबसे बड़ा तत्व का चयन करना तुच्छ है, लेकिन फिर सम्मिलन के लिए रैखिक समय की आवश्यकता होती है, जैसा कि दो सूचियों के संयोजन जैसे अन्य कार्यों में होता है। | ||
उपरैखिक समय में एक आदेश आंकड़े खोजने की रणनीति उपयुक्त डेटा संरचनाओं का उपयोग करके डेटा को एक संगठित फैशन में संग्रहित करना है जो चयन की सुविधा प्रदान करता है। ऐसी दो डेटा संरचनाएँ ट्री-आधारित संरचनाएँ और | उपरैखिक समय में एक आदेश आंकड़े खोजने की रणनीति उपयुक्त डेटा संरचनाओं का उपयोग करके डेटा को एक संगठित फैशन में संग्रहित करना है जो चयन की सुविधा प्रदान करता है। ऐसी दो डेटा संरचनाएँ ट्री-आधारित संरचनाएँ और आवृत्ति तालिकाएँ होती हैं। | ||
जब केवल न्यूनतम | जब केवल न्यूनतम या अधिकतम की आवश्यकता होती है, तो ढेर का उपयोग करने के लिए एक अच्छा तरीका होता है, जो निरंतर समय में न्यूनतम या अधिकतम तत्व खोजने में सक्षम होता है, जबकि सम्मिलन समेत अन्य सभी संचालन O(log ''n'') होते हैं। या अधिक सामान्य रूप से एक [[ स्व-संतुलन बाइनरी सर्च ट्री | स्व-संतुलन बाइनरी सर्च ट्री]] को सरलता से संवर्धित किया जा सकता है, ताकि एक तत्व को सम्मिलित करना और O(log n) समय में kth सबसे बड़ा तत्व खोजना संभव हो सके। इसे [[ ऑर्डर स्टेटिस्टिक ट्री |ऑर्डर स्टेटिस्टिक ट्री]] कहा जाता है। हम बस प्रत्येक बिंदु में कितने संतति हैं, इसकी गिनती करते हैं, और इसका उपयोग यह निर्धारित करने के लिए करते हैं कि किस पथ का अनुसरण करना है। सूचना को कुशलता से अपडेट किया जा सकता है क्योंकि एक नोड को जोड़ने से केवल इसके O(log ''n'') पूर्वजों की संख्या प्रभावित होती है, और ट्री के घुमाव केवल रोटेशन में सम्मिलित बिंदु की गिनती को प्रभावित करते हैं। | ||
एक और सरल | एक और सरल योजना [[ हैश टेबल |द्रुतान्वेषण सारणी]] जैसी कुछ अवधारणाओं पर आधारित है। जब हम पहले से मानों की श्रेणी जानते हैं, तो हम उस श्रेणी को h उपअंतरालों में विभाजित कर सकते हैं और इन्हें h बकेट को नियुक्त कर सकते हैं। जब हम कोई तत्व को डालते हैं, तो हम इसे उस अंतराल के अनुरूप बकेट में जोड़ते हैं, जिसमें यह गिरता है। न्यूनतम या अधिकतम तत्व खोजने के लिए, हम पहली खाली बकेट के लिए प्रारम्भ या अंत से स्कैन करते हैं, और उस बकेट में न्यूनतम या अधिकतम तत्व खोजते हैं। सामान्य रूप से k वें तत्व को खोजने के लिए, हम प्रत्येक बकेट में तत्वों की संख्या की गिनती बनाए रखते हैं, फिर बकेट को बाएं से दाएं जोड़ते हुए स्कैन करें जब तक कि हमें वांछित तत्व वाली बकेट न मिल जाए, फिर उस बकेट में सही तत्व को खोजने के लिए अपेक्षित रैखिक-समय एल्गोरिथ्म का उपयोग करते है। | ||
यदि हम लगभग sqrt(n) आकार का h चुनते हैं, और इनपुट समान रूप से वितरित होने के | यदि हम लगभग sqrt(n) आकार का h चुनते हैं, और इनपुट समान रूप से वितरित होने के नजदीक होता है, तो यह योजना अपेक्षित O(sqrt(n)) समय में चयन कर सकती है। दुर्भाग्य से यह योजना एक संकीर्ण अंतराल में तत्वों के ( गुच्छन) क्लस्टरिंग के प्रति भी संवेदनशील होती है, जिसके परिणामस्वरूप बड़ी संख्या में तत्व हो सकते हैं। क्लस्टरिंग को एक अच्छे हैश फलन के माध्यम से समाप्त किया जा सकता है, लेकिन kth सबसे बड़े हैश मान वाले तत्व को खोजना बहुत उपयोगी नहीं है। इसके अतिरिक्त हैश तालिकाओं की तरह इस संरचना को दक्षता बनाए रखने के लिए तालिका आकार बदलने की आवश्यकता होती है, क्योंकि तत्व जोड़े जाते हैं और n, h<sup>2</sup> से बहुत बड़ा हो जाता है। इसका एक उपयोगी स्थिति डेटा को एक परिमित सीमा में आदेशित आँकड़ा को अत्यधिक ढूंढ रहा है। बकेट अंतराल 1 के साथ उपरोक्त तालिका का उपयोग करना और प्रत्येक बकेट में गिनती बनाए रखना अन्य तरीकों से बहुत बेहतर है। ऐसी हैश तालिकाएँ वर्णनात्मक आँकड़ों में डेटा को वर्गीकृत करने के लिए उपयोग की जाने वाली आवृत्ति तालिकाओं की तरह होती हैं। | ||
== निचली सीमा == | == निचली सीमा == | ||
Line 97: | Line 97: | ||
== भाषा समर्थन == | == भाषा समर्थन == | ||
बहुत कम भाषाओं में सामान्य चयन के लिए अंतर्निहित समर्थन होता है, हालांकि कई सूची के सबसे छोटे या सबसे बड़े तत्व को खोजने की सुविधा प्रदान करते हैं। एक उल्लेखनीय अपवाद [[ C++ ]] है, जो एक टेम्पलेट प्रदान करता है <code>nth_element</code> अपेक्षित रैखिक समय की गारंटी के साथ विधि, और डेटा को विभाजित भी करता है, जिसके लिए आवश्यक है कि nth तत्व को उसके सही स्थान पर क्रमबद्ध किया जाए, nth तत्व से पहले के तत्व इससे कम हों, और nth तत्व के बाद के तत्व इससे अधिक हों। यह निहित है लेकिन आवश्यक नहीं है कि यह अपेक्षित रैखिक समय और डेटा के विभाजन की अपनी आवश्यकता के अनुसार होरे के एल्गोरिथ्म (या कुछ संस्करण) पर आधारित है।<ref>Section 25.3.2 of ISO/IEC 14882:2003(E) and 14882:1998(E)</ref><ref>[http://www.sgi.com/tech/stl/nth_element.html nth_element], SGI STL</ref> | बहुत कम भाषाओं में सामान्य चयन के लिए अंतर्निहित समर्थन होता है, हालांकि कई सूची के सबसे छोटे या सबसे बड़े तत्व को खोजने की सुविधा प्रदान करते हैं। एक उल्लेखनीय अपवाद [[ C++ ]] है, जो एक टेम्पलेट प्रदान करता है <code>nth_element</code> अपेक्षित रैखिक समय की गारंटी के साथ विधि, और डेटा को विभाजित भी करता है, जिसके लिए आवश्यक है कि nth तत्व को उसके सही स्थान पर क्रमबद्ध किया जाए, nth तत्व से पहले के तत्व इससे कम हों, और nth तत्व के बाद के तत्व इससे अधिक हों। यह निहित है लेकिन आवश्यक नहीं है कि यह अपेक्षित रैखिक समय और डेटा के विभाजन की अपनी आवश्यकता के अनुसार होरे के एल्गोरिथ्म (या कुछ संस्करण) पर आधारित है।<ref>Section 25.3.2 of ISO/IEC 14882:2003(E) and 14882:1998(E)</ref><ref>[http://www.sgi.com/tech/stl/nth_element.html nth_element], SGI STL</ref> | ||
[[ पर्ल ]] के लिए, [[ सीपीएएन ]] से उपलब्ध मॉड्यूल [https://metacpan.org/module/Sort::Key::Top Sort::Key::Top], सूची से शीर्ष एन तत्वों का चयन करने के लिए कार्यों का एक | [[ पर्ल ]] के लिए, [[ सीपीएएन ]] से उपलब्ध मॉड्यूल [https://metacpan.org/module/Sort::Key::Top Sort::Key::Top], सूची से शीर्ष एन तत्वों का चयन करने के लिए कार्यों का एक समुच्चय प्रदान करता है। कई ऑर्डरिंग और कस्टम कुंजी निष्कर्षण प्रक्रियाओं का उपयोग करना। इसके अलावा, [https://metacpan.org/module/Statistics::CaseResampling स्टैटिस्टिक्स::CaseResampling] मॉड्यूल शीघ्र चयन का उपयोग करके क्वांटाइल्स की गणना करने के लिए एक फ़ंक्शन प्रदान करता है। | ||
[[ पायथन (प्रोग्रामिंग भाषा) ]] की मानक लाइब्रेरी (2.4 के बाद से) में शामिल हैं <code>[https://docs.python.org/library/heapq.html heapq].nsmallest()</code> तथा <code>nlargest()</code>, ओ (एन लॉग के) समय में, क्रमबद्ध सूचियां लौटाना।<ref>{{Cite web|url=https://stackoverflow.com/a/23038826|title=Python - heapq.nlargest की समय जटिलता क्या है?}}</ref> नम्पी के पास है <code>partition()</code> समारोह। | [[ पायथन (प्रोग्रामिंग भाषा) ]] की मानक लाइब्रेरी (2.4 के बाद से) में शामिल हैं <code>[https://docs.python.org/library/heapq.html heapq].nsmallest()</code> तथा <code>nlargest()</code>, ओ (एन लॉग के) समय में, क्रमबद्ध सूचियां लौटाना।<ref>{{Cite web|url=https://stackoverflow.com/a/23038826|title=Python - heapq.nlargest की समय जटिलता क्या है?}}</ref> नम्पी के पास है <code>partition()</code> समारोह। |
Revision as of 11:54, 22 November 2022
This article includes a list of general references, but it lacks sufficient corresponding inline citations. (जुलाई 2017) (Learn how and when to remove this template message) |
कंप्यूटर विज्ञान में, एक चयन एल्गोरिदम की सूची या सारणी में kth सबसे छोटी संख्या खोजने के लिए एल्गोरिदम है। इस तरह की संख्या को kth क्रम सांख्यिकी कहा जाता है। इसमें न्यूनतम, अधिकतम और माध्यमिक तत्वों को खोजने की परिस्थिति सम्मिलित होती हैं। O(n)-time (सबसे खराब स्थिति का रैखिक समय) अधिकतम एल्गोरिदम हैं, तथा संरचित डेटा के लिए उपरेखीय प्रदर्शन संभव होता है। अत्यन्त O(1) वर्गीकृत किए गए डेटा की एक सरणी के लिए, चयनित अधिक जटिल समस्याओं जैसे निकटतम पास की और सबसे छोटी पथ समस्याओं की उप-समस्या है। कई चयनित एल्गोरिदम एक वर्गीकरण एल्गोरिथ्म को सामान्यीकृत करके व्युत्पन्न किए जाते हैं, और इसके विपरीत कुछ वर्गिकरण एल्गोरिदम चयन के बार-बार आवेदन के रूप में प्राप्त किए जा सकते हैं।
चयन एल्गोरिदम सबसे सरल स्थिति सूची के माध्यम से पुनरावृति करके न्यूनतम या अधिकतम तत्व ढूंढ रहा है, चल रहे न्यूनतम का ट्रैक रखते हुए - अब तक का न्यूनतम या अधिकतम और चयन प्रकार संबंधित के रूप में देखा जा सकता है। इसके विपरीत चयन एल्गोरिथ्म का सबसे जटिल परिस्थिति माध्यिका को खोज रहा है। वास्तव में एक विशेष मध्य-चयन एल्गोरिदम का उपयोग सामान्य चयन एल्गोरिदम बनाने के लिए किया जा सकता है, जैसा कि मध्यस्थों के मध्य में होता है। सबसे प्रसिद्ध चयन एल्गोरिथम शीघ्र चयन है, जो शीघ्र वर्गीकरण से संबंधित होता है। शीघ्र वर्गीकरण, इसका असम्बद्ध रूप से सर्वोत्तम औसत प्रदर्शन है, लेकिन सबसे खराब स्थिति वाला प्रदर्शन खराब है, हालांकि इसे सर्वोत्तम सबसे खराब प्रदर्शन देने के लिए संशोधित किया जा सकता है।
वर्गीकरण करके चयन
सूची या सरणी को क्रमबद्ध करके वांछित तत्व का चयन करके, चयन को क्रमबद्ध करने के लिए कम किया जा सकता है। यह विधि एकल तत्व का चयन करने के लिए अप्रभावी है, लेकिन कुशल है जब एक सरणी से कई चयन किए जाने की आवश्यकता होती है, तो इस स्थिति में केवल एक प्रारंभिक बहुमूल्य प्रकार की आवश्यकता होती है, जिसके बाद कई सुलभ चयन संचालन होते हैं। O(1) सरणी के लिए, हालांकि चयन एक लिंक की गई सूची में O(n) है, युग्म क्रमबद्ध यादृच्छिक पहुंच की कमी के कारण सामान्य रूप से वर्गीकरण के लिए O(n log n) time की आवश्यकता होती है, जहां n सूची की लंबाई है, हालांकि मूलांक वर्गीकरण और गिनती का प्रकार जैसे गैर-तुलनात्मक वर्गीकरण एल्गोरिदम के साथ निम्न परिबंध संभव होता है।
पूरी सूची या सरणी को क्रमबद्ध करने के अतिरिक्त k सबसे छोटे या k सबसे बड़े तत्वों का चयन करने के लिए आंशिक वर्गीकरण का उपयोग कर सकते हैं। k वें सबसे छोटा (resp., k वें सबसे बड़ा तत्व) तब आंशिक रूप से क्रमबद्ध सूची का सबसे बड़ा (resp., सबसे छोटा तत्व) होता है, तो इसके बाद किसी सरणी में पहुँचने के लिए O(1) लगता है तथा किसी सूची में पहुँचने के लिए O(k) ग्रहण करता है।
अनियंत्रित आंशिक वर्गीकरण
यदि आंशिक वर्गीकरण को तनाव मुक्त किया जाता है, जिससे k सबसे छोटे तत्व लौटाए जाते हैं, लेकिन क्रम में नहीं O(k log k) के कारक को समाप्त किया जा सकता है। एक अतिरिक्त अधिकतम चयन (O(k) समय लेते हुए) आवश्यक होता है, लेकिन यह अभी भी O(n) की स्पर्शोन्मुख जटिलता उत्पन्न करता है। वास्तव में विभाजन-आधारित चयन एल्गोरिदम स्वयं k वें सबसे छोटा तत्व तथा k सबसे छोटा तत्व अन्य (तत्वों के क्रम में नहीं) दोनों को उत्पन्न करता है। यह O(n) time में किया जा सकता है - शीघ्र चयन की औसत जटिलता और परिष्कृत विभाजन-आधारित चयन एल्गोरिदम की सबसे खराब जटिलता की स्थिति होती है।
इसके विपरीत एक चयन एल्गोरिदम दिया गया है, O(n) time में सूची के माध्यम से पुनरावृत्ति करके और k वें तत्व से कम सभी तत्वों को रिकॉर्ड करके आसानी से एक अनियंत्रित आंशिक वर्गीकरण (के सबसे छोटे तत्व, क्रम में नहीं) प्राप्त कर सकते हैं। यदि इसका परिणाम k − 1 तत्वों से कम होता है, तो कोई भी शेष तत्व k वें तत्व के बराबर होता है। तत्वों की समानता की संभावना के कारण सावधानी बरतनी चाहिए। तथा k वें तत्व से कम या उसके बराबर सभी तत्वों को सम्मिलित नहीं करना चाहिए, क्योंकि k वें तत्व से बड़े तत्व भी इसके बराबर हो सकते हैं।
इस प्रकार अनियंत्रित आंशिक वर्गीकरण (न्यूनतम k तत्व, लेकिन आदेशित नहीं) और k वें तत्व का चयन बहुत समान समस्याएँ होती हैं। न केवल उनके पास समान स्पर्शोन्मुख जटिलता है, O(n), लेकिन दोनों में से किसी एक के समाधान को सीधा एल्गोरिथ्म द्वारा दूसरे के समाधान में परिवर्तित किया जा सकता है। अधिकतम k तत्व ढूँढना या k वें तत्व के मान के वर्गीकरण के नीचे सूची के तत्वों को फ़िल्टर करना होता है।
आंशिक चयन का प्रकार
आंशिक वर्गीकरण द्वारा चयन का एक सरल उदाहरण आंशिक चयन वर्गीकरण का उपयोग करना है।
न्यूनतम (प्रतिक्रिया अधिकतम) खोजने के लिए स्पष्ट रैखिक समय एल्गोरिदम - सूची पर पुनरावृत्ति करना और अब तक के सभी न्यूनतम (प्रतिक्रिया अधिकतम) तत्व का ट्रैक रखना - आंशिक चयन प्रकार के रूप में देखा जा सकता है, जो कि 1 सबसे छोटा तत्व चुनता है। हालांकि स्थिति k = 1 के लिए कई अन्य आंशिक प्रकार से भी इस एल्गोरिदम को कम करते हैं, जैसे आंशिक हीप वर्गीकरण।
अधिक सामान्य रूप से एक आंशिक चयन वर्गीकरण सरल चयन एल्गोरिदम उत्पन्न करता है, जो O(kn) time लेता है। यह असम्बद्ध रूप से अप्रभावी होता है, लेकिन पर्याप्त रूप से कुशल हो सकता है यदि k छोटा है, तथा लागू करना आसान है। विशेष रूप से हम केवल एसके न्यूनतम मान को पाते हैं और इसे प्रारम्भ में ले जाते हैं, शेष सूची में तब तक दोहराते हैं जब तक कि हम k तत्वों को संचित नहीं कर लेते हैं, और फिर k वें तत्व को वापस कर देते हैं। यहआंशिक चयन वर्गीकरण-आधारित एल्गोरिथम होता है।
function select(list[1..n], k) for i from 1 to k minIndex = i minValue = list[i] for j from i+1 to n do if list[j] < minValue then minIndex = j minValue = list[j] swap list[i] and list[minIndex] return list[k]
विभाजन-आधारित चयन
रैखिक प्रदर्शन विभाजन-आधारित चयन एल्गोरिदम द्वारा प्राप्त किया जा सकता है, सबसे मूल रूप से शीघ्र चयन शीघ्र वर्गीकरण का एक प्रकार है - दोनों में एक मुख्य आधार को चुनता है। तथा इसके द्वारा डेटा का विभाजन करता है, लेकिन जब शीघ्र वर्गीकरण विभाजन के दोनों किनारों पर पुनरावृत्ति करता है, तो शीघ्र चयन केवल एक तरफ की पुनरावृत्ति करता है, अर्थात् वह पक्ष जिस पर वांछित kth तत्व होता है। शीघ्र वर्गीकरण के साथ इसका सर्वोत्त्म औसत प्रदर्शन है, इस स्थिति में रैखिक, लेकिन सबसे खराब प्रदर्शन इस परिस्थिति में द्विघात होता है। यह उदाहरण के लिए पहले तत्व को आधार के रूप में लेने और अधिकतम तत्व की खोज करने से होता है, यदि डेटा पहले से ही क्रमबद्ध होता है। तो व्यावहारिक रूप से एक यादृच्छिक तत्व को धुरी के रूप में चुनकर इससे बचा जा सकता है, जो लगभग निश्चित रैखिक प्रदर्शन को उत्पन्न करता है। वैकल्पिक रूप से, एक अधिक सावधान नियतात्मक धुरी रणनीति का उपयोग किया जा सकता है, जैसे कि माध्यिका की माध्यिका ये हाइब्रिड अंतर्चयन एल्गोरिथम (अन्तर्मुखी के अनुरूप) में संयुक्त हैं, जो शीघ्र चयन के साथ प्रारम्भ होता है, लेकिन यदि प्रगति धीमी होती है, तो माध्यिका के मध्य में वापस आ जाता है, जिसके परिणामस्वरूप O(n) का तेज औसत प्रदर्शन और सर्वोत्त्म सबसे खराब प्रदर्शन दोनों होता है।
विभाजन-आधारित एल्गोरिदम सामान्य रूप से जगह में किया जाता है, जिसके परिणामस्वरूप डेटा को आंशिक रूप से वर्गीकरण किया जाता है। O(n) अतिरिक्त स्थान की कीमत पर मूल डेटा को बदले बिना, उन्हें जगह से बाहर किया जा सकता है।
महत्वपूर्ण योजना के रूप में मध्यस्थ चयन
एक माध्य-चयन एल्गोरिथम का उपयोग एक सामान्य चयन एल्गोरिथम या वर्गीकरण एल्गोरिथम प्राप्त करने के लिए किया जा सकता है, इसे शीघ्र चयन या शीघ्र वर्गीकरण में महत्वपूर्ण योजना के रूप में लागू करके, मध्य-चयन एल्गोरिथम मे असम्बद्ध रूप से सर्वोत्तम रैखिक-समय होता है, तो परिणामी चयन या वर्गीकरण एल्गोरिथम भी होते है। वास्तव में एक सटीक माध्यिका आवश्यक नहीं है - एक सन्निकट माध्यिका पर्याप्त होती है। माध्यिका चयन एल्गोरिथम के माध्यिका में, महत्वपूर्ण योजना एक अनुमानित माध्यिका की गणना करती है, जो इसे आधार के रूप में उपयोग करती है, इस आधार की गणना करने के लिए एक छोटे समुच्चय पर पुनरावर्ती होती है। व्यवहार में धुरी अभिकलन भूमि के ऊपर महत्वपूर्ण होता है, इसलिए इन एल्गोरिदम का सामान्य रूप से उपयोग नहीं किया जाता है, लेकिन यह तकनीक चयन और वर्गीकरण एल्गोरिदम से संबंधित सैद्धांतिक रुचि की है।
विस्तार से एक माध्यिका-चयन एल्गोरिथम दिया गया है, कोई इसे चयन एल्गोरिथम प्राप्त करने के लिए शीघ्र चयन में महत्वपूर्ण योजना के रूप में उपयोग कर सकता है। यदि माध्य-चयन एल्गोरिथम सर्वोत्तम होती है, तो जिसका अर्थ है कि O(n), परिणामी सामान्य चयन एल्गोरिथम भी सर्वोत्तम है, जिसका अर्थ फिर से रैखिक है। ऐसा इसलिए होता है क्योंकि शीघ्र चयन एक विभाजन और जीत एल्गोरिथ्म होता है, तथा प्रत्येक धुरी पर माध्यिका का उपयोग करने का अर्थ है, कि प्रत्येक चरण पर खोज समुच्चय आकार में आधे से कम हो जाता है, इसलिए समग्र जटिलता एक ज्यामितीय श्रृंखला है, जो प्रत्येक चरण की जटिलता होती है, और इस प्रकार बस एक चरण की जटिलता का निरंतर गुणा, वास्तव में बार श्रृंखला का योग करें।
इसी तरह माध्यिका-चयन एल्गोरिथम या माध्यिका खोजने के लिए लागू सामान्य चयन एल्गोरिथम दिया गया है, कोई इसे वर्गीकरण एल्गोरिथम प्राप्त करने के लिए शीघ्र वर्गीकरण में एक महत्वपूर्ण योजना के रूप में उपयोग कर सकता है। यदि चयन एल्गोरिथ्म सर्वोत्तम है, जिसका अर्थ है कि O(n), परिणामी वर्गीकरण एल्गोरिथ्म सर्वोत्तम है, जिसका अर्थ है O(n log n)। माध्यिका वर्गीकरण के लिए सबसे अच्छी धुरी है, क्योंकि यह समान रूप से डेटा को विभाजित करती है, और इस प्रकार सर्वोत्तम वर्गीकरण का दायित्व देती है, यह मानते हुए कि चयन एल्गोरिथ्म सर्वोत्तम है। शीघ्र वर्गीकरण में महत्वपूर्ण योजना अनुमानित माध्य का उपयोग करते हुए, मध्यस्थ की माध्यिका के लिए एक वर्गीकरण एनालॉग उपस्थित होते है, और इसी तरह एक सर्वोत्तम शीघ्र वर्गीकरण उत्पन्न करता है।
चयन द्वारा वृद्धिशील वर्गीकरण
वर्गीकरण द्वारा चयन के विपरीत बार-बार चयन द्वारा क्रमिक रूप से क्रमबद्ध किया जा सकता है। संक्षेप में चयन केवल एक तत्व k वें तत्व उत्पन्न करता है। हालांकि, व्यावहारिक चयन एल्गोरिदम में अधिकांश आंशिक वर्गीकरण सम्मिलित होता है, ऐसा करने के लिए इसको संशोधित भी किया जा सकता है। आंशिक वर्गीकरण द्वारा चयन स्वाभाविक रूप से ऐसा करता है, तत्वों को k तक क्रमबद्ध करना और विभाजन द्वारा चयन करना भी कुछ तत्वों को क्रमबद्ध करता है। पिवोट्स को सही स्थिति में क्रमबद्ध किया जाता है, जिसमें kth तत्व अंतिम केंद्र होता है, और पिवोट्स के बीच के तत्वों का मान होता है धुरी मानो के बीच विभाजन-आधारित चयन और विभाजन-आधारित वर्गीकरण के बीच का अंतर जैसा कि शीघ्र चयन बनाम शीघ्र वर्गीकरण में होता है चयन में प्रत्येक धुरी के केवल एक तरफ पुनरावृत्ति होती है, केवल पिवोट्स को वर्गीकरण करना (औसत log(n) पिवोट्स का उपयोग किया जाता है, धुरी के दोनों किनारों पर पुनरावर्ती होने के अतिरिक्त।
इसका उपयोग उसी डेटा पर बाद के चयनों को गति देने के लिए किया जा सकता है। तीव्र में पूरी तरह से क्रमबद्ध सरणी O(1) चयन की अनुमति देती है। इसके अतिरिक्त पहले एक पूर्ण वर्गीकरण करने की तुलना में बार-बार चयन द्वारा वृद्धिशील छँटाई कई चयनों पर वर्गीकरण लागत को परिशोधित करती है।
आंशिक रूप से वर्गीकरण किए गए डेटा K तक के लिए, जब तक आंशिक रूप से वर्गीकृत किए गए डेटा और इंडेक्स के तक डेटा वर्गीकरण किया जाता है, तब तक रिकॉर्ड किया जाता है, k से कम या उसके बराबर j के बाद के चयन केवल jth तत्व का चयन कर सकते हैं, क्योंकि यह पहले से ही वर्गीकरण किया गया है, जबकि k से अधिक j के चयनों को केवल kth स्थिति से ऊपर के तत्वों को वर्गीकृत करने की आवश्यकता है
विभाजित डेटा के लिए, यदि पिवोट्स की सूची संग्रहीत की जाती है (उदाहरण के लिए, सूचकांकों की एक क्रमबद्ध सूची में), तो बाद के चयनों को केवल दो पिवोट्स (निकटतम पिवोट्स नीचे और ऊपर) के बीच अंतराल में चयन करने की आवश्यकता होती है। सबसे बड़ा लाभ शीर्ष-स्तर के पिवोट्स से है, जो महंगे बड़े विभाजनों को समाप्त करते हैं। डेटा के मध्य के पास एक एकल पिवट (धुरी) भविष्य के चयनों के लिए आधे समय में कटौती करता है। पिवट सूची बाद के चयनों में बढ़ेगी, क्योंकि डेटा अधिक क्रमबद्ध हो जाता है, और एक पूर्ण वर्गीकृत के आधार के रूप में विभाजन-आधारित वर्गीकृत में भी पास किया जा सकता है।
उप-रेखीय समय में चयन करने के लिए डेटा संरचनाओं का उपयोग करना
डेटा की एक असंगठित सूची को देखते हुए, न्यूनतम तत्व को खोजने के लिए रैखिक समय (Ω(n)) की आवश्यकता होती है, क्योंकि हमें प्रत्येक तत्व की जांच करनी होती है (अन्यथा, हम इसे याद कर सकते हैं)। यदि हम सूची को व्यवस्थित करते हैं, उदाहरण के लिए इसे प्रत्येक समय क्रमबद्ध करके रखते हैं, तो kth सबसे बड़ा तत्व का चयन करना तुच्छ है, लेकिन फिर सम्मिलन के लिए रैखिक समय की आवश्यकता होती है, जैसा कि दो सूचियों के संयोजन जैसे अन्य कार्यों में होता है।
उपरैखिक समय में एक आदेश आंकड़े खोजने की रणनीति उपयुक्त डेटा संरचनाओं का उपयोग करके डेटा को एक संगठित फैशन में संग्रहित करना है जो चयन की सुविधा प्रदान करता है। ऐसी दो डेटा संरचनाएँ ट्री-आधारित संरचनाएँ और आवृत्ति तालिकाएँ होती हैं।
जब केवल न्यूनतम या अधिकतम की आवश्यकता होती है, तो ढेर का उपयोग करने के लिए एक अच्छा तरीका होता है, जो निरंतर समय में न्यूनतम या अधिकतम तत्व खोजने में सक्षम होता है, जबकि सम्मिलन समेत अन्य सभी संचालन O(log n) होते हैं। या अधिक सामान्य रूप से एक स्व-संतुलन बाइनरी सर्च ट्री को सरलता से संवर्धित किया जा सकता है, ताकि एक तत्व को सम्मिलित करना और O(log n) समय में kth सबसे बड़ा तत्व खोजना संभव हो सके। इसे ऑर्डर स्टेटिस्टिक ट्री कहा जाता है। हम बस प्रत्येक बिंदु में कितने संतति हैं, इसकी गिनती करते हैं, और इसका उपयोग यह निर्धारित करने के लिए करते हैं कि किस पथ का अनुसरण करना है। सूचना को कुशलता से अपडेट किया जा सकता है क्योंकि एक नोड को जोड़ने से केवल इसके O(log n) पूर्वजों की संख्या प्रभावित होती है, और ट्री के घुमाव केवल रोटेशन में सम्मिलित बिंदु की गिनती को प्रभावित करते हैं।
एक और सरल योजना द्रुतान्वेषण सारणी जैसी कुछ अवधारणाओं पर आधारित है। जब हम पहले से मानों की श्रेणी जानते हैं, तो हम उस श्रेणी को h उपअंतरालों में विभाजित कर सकते हैं और इन्हें h बकेट को नियुक्त कर सकते हैं। जब हम कोई तत्व को डालते हैं, तो हम इसे उस अंतराल के अनुरूप बकेट में जोड़ते हैं, जिसमें यह गिरता है। न्यूनतम या अधिकतम तत्व खोजने के लिए, हम पहली खाली बकेट के लिए प्रारम्भ या अंत से स्कैन करते हैं, और उस बकेट में न्यूनतम या अधिकतम तत्व खोजते हैं। सामान्य रूप से k वें तत्व को खोजने के लिए, हम प्रत्येक बकेट में तत्वों की संख्या की गिनती बनाए रखते हैं, फिर बकेट को बाएं से दाएं जोड़ते हुए स्कैन करें जब तक कि हमें वांछित तत्व वाली बकेट न मिल जाए, फिर उस बकेट में सही तत्व को खोजने के लिए अपेक्षित रैखिक-समय एल्गोरिथ्म का उपयोग करते है।
यदि हम लगभग sqrt(n) आकार का h चुनते हैं, और इनपुट समान रूप से वितरित होने के नजदीक होता है, तो यह योजना अपेक्षित O(sqrt(n)) समय में चयन कर सकती है। दुर्भाग्य से यह योजना एक संकीर्ण अंतराल में तत्वों के ( गुच्छन) क्लस्टरिंग के प्रति भी संवेदनशील होती है, जिसके परिणामस्वरूप बड़ी संख्या में तत्व हो सकते हैं। क्लस्टरिंग को एक अच्छे हैश फलन के माध्यम से समाप्त किया जा सकता है, लेकिन kth सबसे बड़े हैश मान वाले तत्व को खोजना बहुत उपयोगी नहीं है। इसके अतिरिक्त हैश तालिकाओं की तरह इस संरचना को दक्षता बनाए रखने के लिए तालिका आकार बदलने की आवश्यकता होती है, क्योंकि तत्व जोड़े जाते हैं और n, h2 से बहुत बड़ा हो जाता है। इसका एक उपयोगी स्थिति डेटा को एक परिमित सीमा में आदेशित आँकड़ा को अत्यधिक ढूंढ रहा है। बकेट अंतराल 1 के साथ उपरोक्त तालिका का उपयोग करना और प्रत्येक बकेट में गिनती बनाए रखना अन्य तरीकों से बहुत बेहतर है। ऐसी हैश तालिकाएँ वर्णनात्मक आँकड़ों में डेटा को वर्गीकृत करने के लिए उपयोग की जाने वाली आवृत्ति तालिकाओं की तरह होती हैं।
निचली सीमा
कंप्यूटर प्रोग्रामिंग की कला में, डोनाल्ड ई। नुथ ने n वस्तुओं की एक असंगठित सूची (केवल तुलनाओं का उपयोग करके) की सबसे छोटी प्रविष्टियों का पता लगाने के लिए आवश्यक तुलनाओं की संख्या के लिए कई निचली सीमाओं पर चर्चा की। न्यूनतम या अधिकतम प्रविष्टि के लिए n - 1 की एक तुच्छ निचली सीमा है। इसे देखने के लिए, एक टूर्नामेंट पर विचार करें जहां प्रत्येक गेम एक तुलना का प्रतिनिधित्व करता है। चूंकि टूर्नामेंट के विजेता को छोड़कर प्रत्येक खिलाड़ी को विजेता को जानने से पहले एक गेम हारना होगा, हमारे पास n - 1 तुलनाओं की निचली सीमा है।
अन्य इंडेक्स के लिए कहानी और अधिक जटिल हो जाती है। हम परिभाषित करते हैं t सबसे छोटे मानों को खोजने के लिए आवश्यक तुलनाओं की न्यूनतम संख्या के रूप में। नुथ एस.एस. किसलिट्सिन द्वारा प्रकाशित एक पेपर का संदर्भ देता है, जो इस मूल्य पर एक ऊपरी सीमा दिखाता है:
यह सीमा टी = 2 के लिए प्राप्त करने योग्य है लेकिन बेहतर, अधिक जटिल सीमाएं बड़े टी के लिए जानी जाती हैं।[citation needed]
अंतरिक्ष जटिलता
चयन की आवश्यक स्थान जटिलता ओ (1) अतिरिक्त भंडारण है, जिसमें उस सरणी को संग्रहीत करने के अलावा जिसमें चयन किया जा रहा है। इष्टतम O(n) समय जटिलता को संरक्षित करते हुए ऐसी अंतरिक्ष जटिलता प्राप्त की जा सकती है।[1]
This section needs expansion. You can help by adding to it. (January 2019) |
ऑनलाइन चयन एल्गोरिथ्म
ऑनलाइन एल्गोरिदम चयन एक धारा के सबसे छोटे तत्व की गणना करने के लिए संकीर्ण रूप से संदर्भित हो सकता है, इस मामले में आंशिक छँटाई एल्गोरिदम - k + O (1) स्थान के साथ k अब तक के सबसे छोटे तत्वों के लिए - का उपयोग किया जा सकता है, लेकिन विभाजन-आधारित एल्गोरिदम नहीं हो सकता .
वैकल्पिक रूप से, चयन के लिए स्वयं ऑनलाइन एल्गोरिथम होना आवश्यक हो सकता है, अर्थात, एक तत्व को केवल अवलोकन के उदाहरण पर अनुक्रमिक इनपुट से चुना जा सकता है और प्रत्येक चयन, क्रमशः इनकार, अपरिवर्तनीय है। समस्या इन बाधाओं के तहत, सबसे बड़ी संभावना के साथ इनपुट अनुक्रम का एक विशिष्ट तत्व (उदाहरण के लिए सबसे बड़ा या सबसे छोटा मान) का चयन करना है। इस समस्या को ऑड्स एल्गोरिथम द्वारा हल किया जा सकता है, जो एक स्वतंत्रता की स्थिति के तहत इष्टतम उपज देता है; यह इनपुट की लंबाई में रैखिक होने वाली गणनाओं की संख्या के साथ एक एल्गोरिदम के रूप में भी इष्टतम है।
सबसे सरल उदाहरण उच्च संभावना के साथ अधिकतम चुनने की सचिव समस्या है, इस मामले में इष्टतम रणनीति (यादृच्छिक डेटा पर) पहले n/e तत्वों के चल रहे अधिकतम को ट्रैक करना और उन्हें अस्वीकार करना है, और फिर पहले तत्व का चयन करना है इस अधिकतम से अधिक।
संबंधित समस्याएं
श्रेणी प्रश्न ों की समस्या उत्पन्न करते हुए, एक सूची के भीतर श्रेणियों पर लागू करने के लिए चयन समस्या का सामान्यीकरण किया जा सकता है। रेंज क्वेरीज़ # मेडियन (एकाधिक रेंज के माध्यकों की गणना) के प्रश्न का विश्लेषण किया गया है।
भाषा समर्थन
बहुत कम भाषाओं में सामान्य चयन के लिए अंतर्निहित समर्थन होता है, हालांकि कई सूची के सबसे छोटे या सबसे बड़े तत्व को खोजने की सुविधा प्रदान करते हैं। एक उल्लेखनीय अपवाद C++ है, जो एक टेम्पलेट प्रदान करता है nth_element
अपेक्षित रैखिक समय की गारंटी के साथ विधि, और डेटा को विभाजित भी करता है, जिसके लिए आवश्यक है कि nth तत्व को उसके सही स्थान पर क्रमबद्ध किया जाए, nth तत्व से पहले के तत्व इससे कम हों, और nth तत्व के बाद के तत्व इससे अधिक हों। यह निहित है लेकिन आवश्यक नहीं है कि यह अपेक्षित रैखिक समय और डेटा के विभाजन की अपनी आवश्यकता के अनुसार होरे के एल्गोरिथ्म (या कुछ संस्करण) पर आधारित है।[2][3]
पर्ल के लिए, सीपीएएन से उपलब्ध मॉड्यूल Sort::Key::Top, सूची से शीर्ष एन तत्वों का चयन करने के लिए कार्यों का एक समुच्चय प्रदान करता है। कई ऑर्डरिंग और कस्टम कुंजी निष्कर्षण प्रक्रियाओं का उपयोग करना। इसके अलावा, स्टैटिस्टिक्स::CaseResampling मॉड्यूल शीघ्र चयन का उपयोग करके क्वांटाइल्स की गणना करने के लिए एक फ़ंक्शन प्रदान करता है।
पायथन (प्रोग्रामिंग भाषा) की मानक लाइब्रेरी (2.4 के बाद से) में शामिल हैं heapq.nsmallest()
तथा nlargest()
, ओ (एन लॉग के) समय में, क्रमबद्ध सूचियां लौटाना।[4] नम्पी के पास है partition()
समारोह।
मैटलैब शामिल है maxk()
तथा mink()
फ़ंक्शंस, जो सदिश के साथ-साथ उनके सूचकांकों में अधिकतम (न्यूनतम) k मान लौटाते हैं।
क्योंकि छँटाई एल्गोरिथम # भाषा समर्थन अधिक सर्वव्यापी है, गति में कमी के बावजूद कई वातावरणों में अनुक्रमण के बाद छँटाई का सरलीकृत दृष्टिकोण पसंद किया जाता है। दरअसल, आलसी मूल्यांकन के लिए, यह सरलीकृत दृष्टिकोण k सबसे छोटी/सबसे बड़ी क्रमबद्ध (अधिकतम/न्यूनतम विशेष मामले के साथ) के लिए संभव सर्वोत्तम जटिलता भी प्राप्त कर सकता है यदि सॉर्ट पर्याप्त आलसी है[citation needed].
यह भी देखें
संदर्भ
- ↑ Lai T.W., Wood D. (1988) Implicit selection. In: Karlsson R., Lingas A. (eds) SWAT 88. SWAT 1988. Lecture Notes in Computer Science, vol 318. Springer, Berlin, Heidelberg
- ↑ Section 25.3.2 of ISO/IEC 14882:2003(E) and 14882:1998(E)
- ↑ nth_element, SGI STL
- ↑ "Python - heapq.nlargest की समय जटिलता क्या है?".
ग्रन्थसूची
- Blum, M.; Floyd, R. W.; Pratt, V. R.; Rivest, R. L.; Tarjan, R. E. (August 1973). "Time bounds for selection" (PDF). Journal of Computer and System Sciences. 7 (4): 448–461. doi:10.1016/S0022-0000(73)80033-9.
- Floyd, R. W.; Rivest, R. L. (March 1975). "Expected time bounds for selection". Communications of the ACM. 18 (3): 165–172. doi:10.1145/360680.360691. S2CID 3064709.
- Kiwiel, K. C. (2005). "On Floyd and Rivest's SELECT algorithm". Theoretical Computer Science. 347 (1–2): 214–238. doi:10.1016/j.tcs.2005.06.032.
- Donald Knuth. The Art of Computer Programming, Volume 3: Sorting and Searching, Third Edition. Addison-Wesley, 1997. ISBN 0-201-89685-0. Section 5.3.3: Minimum-Comparison Selection, pp. 207–219.
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. Introduction to Algorithms, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Chapter 9: Medians and Order Statistics, pp. 183–196. Section 14.1: Dynamic order statistics, pp. 302–308.
- This article incorporates public domain material from Black, Paul E. "Select". Dictionary of Algorithms and Data Structures.
बाहरी संबंध
- "Lecture notes for January 25, 1996: Selection and order statistics", ICS 161: Design and Analysis of Algorithms, David Eppstein