गिनती करने का परिचय क्रमबद्ध

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

पहले 1954 में एल्गोरिथ्म को हरोल्ड एच. सेवार्ड द्वारा वर्णित किया गया था और कंप्यूटर विज्ञान में एक मूलभूत तकनीक बनी हुई है। इसकी सादगी और दक्षता इसे एक मामूली स्प्रेड के साथ छात्र उम्र, ग्रेड या किसी भी पूर्ण डेटा को सॉर्ट करने जैसे कार्यों के लिए आदर्श बनाती है। मूल्य सीमा के अनुपात में सहायक भंडारण का लाभ उठाकर, गिनती सॉर्ट तुलना छँटाई की O(n log n) कम सीमा से बचाता है, ओ(n + k) समय को प्राप्त करता है जहां k इनपुट मूल्यों की सीमा है।

कैसे गिनती सॉर्ट वर्क्स

गिनती का मुख्य तंत्र सीधा है: यह गणना करता है कि प्रत्येक मूल्य कितने बार इनपुट सरणी में दिखाई देता है, फिर प्रत्येक तत्व की अंतिम स्थिति को गणना करने के लिए उस गणना का उपयोग करता है। प्रक्रिया में तीन अलग-अलग चरण होते हैं:

  1. Counting: आकार k (इनपुट मूल्यों की सीमा) की एक गिनती सरणी बनाएं, शून्य होने के लिए शुरू की गई। इनपुट सरणी के माध्यम से इसे इटरेट करें और प्रत्येक मूल्य के लिए गिनती बढ़ाएं।
  2. Computing prefixes: एक उपसर्ग सम सारणी में गिनती सरणी को परिवर्तित करें, जहां सूचकांक में प्रत्येक तत्व में मैं तत्वों की संचयी गिनती को कम या बराबर रखता हूं। यह कदम सॉर्ट किए गए आउटपुट में प्रत्येक विशिष्ट मान के लिए प्रारंभिक स्थिति निर्धारित करता है।
  3. Placing तत्वों: सही से बाएं (स्थिरता के लिए) इनपुट सरणी को अनुप्रस्थित करें, आउटपुट सरणी में सही सूचकांक खोजने के लिए गिनती सरणी का उपयोग करें, तत्व को वहां रखें, और गिनती को कम करें। अंतिम आउटपुट इनपुट की एक छँटाई प्रतिलिपि है।

एल्गोरिथ्म एक नई छँटाई वाली सरणी देता है, जो मूल रूप से अपरिवर्तित हो जाता है। एक संस्करण जिसे in-place गिनती क्रमबद्ध] कहा जाता है, लेकिन शायद ही कभी इसका उपयोग किया जाता है क्योंकि यह स्थिरता या अंतरिक्ष दक्षता से समझौता करता है।

चरण-दर-चरण उदाहरण

सरणी को सॉर्ट करने पर विचार करें [4,2,2,8,3,3,1] जहां मान 0 से 8 तक हैं।

  1. Count: गिनती सरणी का आकार 9 (0–8) → [0,1,2,2,1,0,0,0,1] (Index 1 एक बार दिखाई देता है, सूचकांक 2 दो बार, सूचकांक 3 दो बार, सूचकांक 4 एक बार, सूचकांक 8 एक बार)।
  2. ]Prefix sum: संचयी के लिए रूपांतरण → [0,1,3,5,6,6,6,6,7]. अब प्रत्येक मूल्य हमें क्रमबद्ध उत्पादन में उस संख्या के लिए प्रारंभिक स्थिति बताता है।
  3. Output: अंत से मूल सरणी अनुप्रस्थ: पहला तत्व पढ़ा गया है 1 → स्थिति = गिनती[1] - 1 = 0 → आउटपुट [0]=1, decrement count[1] to 0. आगामी 3 → स्थिति = count[3] - 1 = 4 → आउटपुट [4] = 3, गिनती[3]=4. Continue जब तक सभी तत्वों को रखा गया। अंतिम आउटपुट: [1,2,2,3,3,4,8].

यह उदाहरण दर्शाता है कि कैसे गिनती सॉर्ट पूरी तरह से तुलना से बच जाता है, पूरी तरह से अंकगणितीय संचालन पर निर्भर करता है।

कम्प्यूटेशनल जटिलता

समय जटिलता

  • ]सर्वश्रेष्ठ, औसत और वर्स्ट केस: O(n + k), जहां n तत्वों की संख्या है और k इनपुट मानों की सीमा है। जब k n के सापेक्ष छोटा है, तो एल्गोरिदम रैखिक समय में चलता है।
  • ]Comparison to तुलना प्रकार: Quicksort and Mergesort is O(n log n) औसत जटिलता. n = 106 और k = 1000 के लिए, गिनती सॉर्ट (≈ 1,001,000 ऑपरेशन) लगभग 13 गुना तेज है एक ठेठ O(n log n) की तुलना में.

अंतरिक्ष जटिलता

  • Primary: O(k) गिनती सरणी के लिए, प्लस O(n) उत्पादन सरणी के लिए। इस स्मृति ओवरहेड को प्रतिबंधित किया जा सकता है अगर k बड़ा है (जैसे 32-bit integers जहां k = 232)।
  • Stable संस्करण: के लिए आकार n की एक सहायक उत्पादन सरणी की आवश्यकता है; इन-प्लेस वेरिएंट स्थिरता का बलिदान करते हैं या जटिल सूचकांक हेरफेर का उपयोग करते हैं।

जब गिनती सॉर्ट का उपयोग किया जाता है

गिनती छंटनी निम्नलिखित स्थितियों के तहत सबसे प्रभावी है:

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

उत्कृष्ट उपयोग के मामलों में सॉर्टिंग ग्रेड (0-100), उम्र (0–120), उत्पाद श्रेणियां (कुछ सौ SKU तक), या ]Radix क्रमबद्ध]]]Radix क्रमबद्ध]]] में एक सबराउटिन के रूप में शामिल हैं।

सीमा और विचार

इसकी गति के बावजूद, गणना करने वाले सॉर्ट में ऐसी कमी है जो इसकी प्रयोज्यता को सीमित करती है:

  • Integer केवल: यह सीधे फ्लोटिंग पॉइंट नंबर या स्ट्रिंग्स को सॉर्ट नहीं कर सकता जब तक कि उन्हें एक आकस्मिक पूर्णांक सेट में परिवर्तित नहीं किया जाता है।
  • ]बड़ा रेंज: यदि कश्मीर dwarfs n-उदाहरण के लिए, 1 और 107 के बीच मानों के साथ 100 संख्याओं को सॉर्ट करना - गिनती सरणी केवल कुछ तत्वों को सॉर्ट करते समय भारी स्मृति का उपभोग करती है।
  • ]गैर-अनुकूल: गिनती सॉर्ट हमेशा पूरे इनपुट को स्कैन करने और गिनती सरणी के निर्माण की आवश्यकता होती है, भले ही डेटा पहले से ही सॉर्ट हो या लगभग सॉर्ट हो।
  • ]Negative मान: मानक गिनती सॉर्ट गैर-नकारात्मक पूर्णांक मान लेता है। नकारात्मक को संभालने के लिए, आप न्यूनतम घटाकर मानों को स्थानांतरित कर सकते हैं (अधिकतम - मिनट तक की सीमा 0 बना रही है)।

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

संबंधित छंटनी एल्गोरिथ्म के साथ तुलना

गिनती छंटनी बनाम Radix क्रमबद्ध

रेडिक्स सॉर्ट कम से कम महत्वपूर्ण से अधिक महत्वपूर्ण अंकों को छंटनी करके विचार को बढ़ाता है, प्रत्येक अंक पर एक स्थिर प्रकार (अक्सर गिनती छंटनी) का उपयोग करता है। जबकि गणना पूर्ण श्रेणी के k पर एक पास पर सॉर्ट काम करती है, रेडिक्स सॉर्ट एक छोटी अंक सीमा (जैसे, बेस 256) पर एकाधिक गुजरता है, जो बड़े k के लिए स्मृति उपयोग को कम करता है। उदाहरण के लिए, 32-बिट पूर्णांक के साथ पूर्णांक के साथ 32-bit पूर्णांकों को क्रमबद्ध करने के लिए 232 प्रविष्टियों की एक गिनती सरणी की आवश्यकता होगी, जबकि रेडिक्स 8-बिट अंकों के साथ क्रमबद्ध करें, प्रति पास 256 प्रविष्टियों की आवश्यकता होती है और केवल चार पास।

गिनती छंटनी बनाम बाल्टी छंटनी

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

एक स्थिर गिनती छंटनी लागू करना

स्थिरता महत्वपूर्ण है जब एक कुंजी द्वारा क्रमबद्ध किया जाता है जबकि अन्य कुंजी से समान तत्वों के सापेक्ष आदेश को संरक्षित किया जाता है। मानक गिनती क्रमबद्ध एल्गोरिदम स्वाभाविक रूप से स्थिर होता है जब आउटपुट प्लेसमेंट लूप सही से बाएं तक इनपुट को उलट देता है। यहां स्थिर संस्करण की एक पाठ्य रूपरेखा है:

  1. जैसा कि वर्णन किया गया है, गणना की गई सारणी।
  2. उपसर्गों में परिवर्तित (एक प्रकार का उत्पादन में प्रत्येक मान के स्थान)।
  3. प्रत्येक तत्व के लिए, इसे अपनी गणना से संकेतित स्थिति पर रखें, फिर उस गणना को कम करें।

चूंकि हम अंत से तत्वों की प्रक्रिया करते हैं, इसलिए दिए गए मूल्य की अंतिम घटना उच्चतम संभव सूचकांक में चली जाती है, सापेक्ष ऑर्डर को संरक्षित करती है। यह स्थिर संस्करण प्रत्येक अंक पर सही ढंग से कार्य करने के लिए रेडिक्स सॉर्ट के लिए आवश्यक है।

प्रैक्टिकल अनुप्रयोग

  • ]Educational grading system: O(n) समय में सैकड़ों परीक्षा स्कोर (रेंज 0-100) को छंटनी।
  • ]Bioinformatics: छंटनी पूर्णांक पढ़ने की गिनती या डीएनए के क्षत्रय जब वर्णमाला आकार छोटा है (A, C, G, T).
  • डेटाबेस इंडेक्स में रखरखाव: रेंज में अद्वितीय पूर्णांक पहचानकर्ता को क्रमबद्ध करना स्मृति में फिट करने के लिए काफी छोटा है।
  • Image processing:] जब इमारत नज़र-अप टेबल बनाते हैं तो हिस्टोग्राम डिब्बे या रंग तीव्रता (0-255) छंटनी करना।
  • ] माध्यमिक कुंजी द्वारा सोर्टिंग: रेडिक्स सॉर्ट के अंदर प्रयुक्त, जो कई पुस्तकालयों और भाषाओं में कुशल सॉर्टिंग के लिए वर्कहॉर्स है (जैसे, .NET रनटाइम छोटे रेंज के लिए गणना सॉर्ट सहित एल्गोरिदम के अनुकूल मिश्रण का उपयोग करता है)।

सिद्धांत और विविधताओं पर अधिक जानकारी के लिए, आधिकारिक संदर्भों जैसे Wikipedia: गिनती क्रमबद्ध] और Geeks: counting क्रमबद्ध]. अन्य एल्गोरिदम के साथ व्यावहारिक तुलना Brilliant's counting क्रमबद्ध article]] में मिल सकती है।

बड़े रेंजों के लिए गणना क्रमबद्ध अनुकूलित करना

जब कश्मीर बड़ा है लेकिन n भी बड़ा है, तो शुद्ध गिनती सॉर्ट स्मृति-गहन हो जाता है। कई अनुकूलन मौजूद हैं:

  • संपीड़ित स्पर्सेसिटी: एक आकस्मिक सरणी के बजाय एक हैश मानचित्र का उपयोग करें जब उपयोग किए गए मूल्यों की सीमा बड़ी है लेकिन अलग-अलग मूल्यों की संख्या छोटी है। यह हैशिंग ओवरहेड के लिए निरंतर समय अनुक्रमण का व्यापार करता है लेकिन स्मृति की खपत को कम करता है।
  • ]Hybrid दृष्टिकोण: संयुक्त रूप से अन्य एल्गोरिदम के साथ गणना करें। उदाहरण के लिए, यदि सीमा 106 से अधिक है, तो रेडिक्स सॉर्ट का उपयोग एक आधार के साथ करें जो डिजिट रेंज को छोटा रखता है।
  • In-place बदलनेवाला: कुछ अनुकूलन एक उत्पादन सरणी के बिना O(k) के लिए अतिरिक्त स्थान को कम करते हैं, लेकिन वे आम तौर पर स्थिरता का बलिदान करते हैं या पदों का पता लगाने के लिए चक्र की आवश्यकता होती है।

निष्कर्ष

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