यह शायद आप के लिए एक छोटे से खेल में देर से जहाँ तक आपके प्रश्न का संबंध है आता है, लेकिन के पूरा हो जाने।
परीक्षण आपके विशिष्ट कंप्यूटर आर्किटेक्चर, कंपाइलर और कार्यान्वयन के लिए इस प्रश्न का उत्तर देने का सबसे अच्छा तरीका है। इसके अलावा, सामान्यीकरण हैं।
सबसे पहले, प्राथमिकता कतार जरूरी नहीं है ओ (एन लॉग एन)।
यदि आपके पास पूर्णांक डेटा है, तो प्राथमिकता पंक्तियां हैं जो ओ (1) समय में काम करती हैं। बीचर एंड मेयर का 1 99 2 का प्रकाशन "विभाजन के लिए मोर्फोलॉजिकल दृष्टिकोण: वाटरशेड ट्रांसफॉर्मेशन" पदानुक्रमित कतारों का वर्णन करता है, जो सीमित सीमा के साथ पूर्णांक मानों के लिए बहुत तेज़ी से काम करता है। ब्राउन के 1 9 88 के प्रकाशन "कैलेंडर कतार: सिमुलेशन इवेंट सेट समस्या के लिए एक तेज़ 0 (1) प्राथमिकता कतार कार्यान्वयन" एक और समाधान प्रदान करता है जो पूर्णांक की बड़ी श्रृंखला के साथ अच्छी तरह से काम करता है - दो दशक के काम के बाद ब्राउन के प्रकाशन ने पूर्णांक करने के लिए कुछ अच्छे परिणाम दिए हैं प्राथमिकता कतार तेज़। लेकिन इन कतारों की मशीनरी जटिल हो सकती है: बाल्टी प्रकार और रेडिक्स प्रकार अभी भी ओ (1) ऑपरेशन प्रदान कर सकते हैं। कुछ मामलों में, आप ओ (1) प्राथमिकता कतार का लाभ उठाने के लिए फ़्लोटिंग-पॉइंट डेटा को भी मापने में सक्षम हो सकते हैं।
यहां तक कि फ़्लोटिंग-पॉइंट डेटा के सामान्य मामले में, ओ (एन लॉग एन) थोड़ा भ्रामक है।Edelkamp की किताब
आप कर सकते हैं के रूप में: "अनुमानी खोजें: सिद्धांत और अनुप्रयोग" विभिन्न प्राथमिकता कतार एल्गोरिदम (याद है, प्राथमिकता कतारों छंटाई और ढेर प्रबंधन के बराबर हैं) के लिए समय जटिलता दिखा नीचे दिए सुविधाजनक टेबल है देखें, कई प्राथमिकता कतारों में ओ (लॉग एन) लागत केवल प्रविष्टि के लिए नहीं है, बल्कि निष्कर्षण के लिए भी, और यहां तक कि कतार प्रबंधन भी है! जबकि गुणांक को आमतौर पर एल्गोरिदम की समय जटिलता को मापने के लिए गिरा दिया जाता है, लेकिन इन लागतों को अभी भी जानने के लायक हैं।
लेकिन इन सभी कतारों में अभी भी समय जटिलताएं हैं जो तुलनीय हैं। कौन सा सबसे अच्छा है? क्रिस एल लुएन्गो हैंड्रिक्स द्वारा एक 2010 का पेपर "छवि विश्लेषण के लिए प्राथमिकता पंक्तियों की समीक्षा" इस सवाल को संबोधित करता है।
हेंड्रिक्स 'पकड़ परीक्षण में, एक प्राथमिकता कतार रेंज [0,50] में एन यादृच्छिक संख्या के साथ वरीयता प्राप्त किया गया था। कतार के शीर्ष-तत्व को तब हटा दिया गया था, [0,2] श्रेणी में यादृच्छिक मूल्य से वृद्धि हुई, और फिर कतारबद्ध की गई। इस ऑपरेशन को 10^7 बार दोहराया गया था। यादृच्छिक संख्याओं को उत्पन्न करने के ऊपरी हिस्से को मापा समय से घटाया गया था। सीढ़ी कतार और पदानुक्रमिक ढेर ने इस परीक्षण से काफी अच्छा प्रदर्शन किया।
कतारों को प्रारंभ करने और खाली करने के लिए प्रति तत्व समय भी मापा गया था - ये परीक्षण आपके प्रश्न के लिए बहुत प्रासंगिक हैं।
आप देख सकते हैं, अलग कतारों अक्सर enqueueing और dequeueing करने के लिए बहुत अलग अलग प्रतिक्रियाएं था। इन आंकड़ों का अर्थ यह है कि प्राथमिकता कतार एल्गोरिदम हो सकते हैं जो निरंतर संचालन के लिए श्रेष्ठ हैं, केवल भरने के लिए एल्गोरिदम का कोई सर्वश्रेष्ठ विकल्प नहीं है और फिर प्राथमिकता कतार (ऑपरेशन जो आप कर रहे हैं) खाली कर रहे हैं।
के अपने प्रश्नों पर वापस देखें:
क्या तेज है: एक प्राथमिकता कतार में डालने, या पूर्वव्यापी छँटाई?
ऊपर दिखाए गए अनुसार, प्राथमिकता कतारों को कुशल बनाया जा सकता है, लेकिन अभी भी सम्मिलन, निष्कासन और प्रबंधन के लिए लागतें हैं। एक वेक्टर में सम्मिलन तेजी से है। यह ओ (1) अमूर्त समय में है, और कोई प्रबंधन लागत नहीं है, साथ ही वेक्टर ओ (एन) पढ़ने के लिए है।
वेक्टर को सॉर्ट करने से आपको ओ (एन लॉग एन) लगता है कि आपके पास फ्लोटिंग-पॉइंट डेटा है, लेकिन इस बार जटिलता प्राथमिकता कतारों जैसी चीजों को छुपा नहीं रही है। (हालांकि, आपको कुछ सावधान रहना होगा, हालांकि, क्विक्सॉर्ट कुछ डेटा पर बहुत अच्छी तरह से चलता है, लेकिन इसमें ओ (एन^2) की सबसे बुरी स्थिति की जटिलता है। कुछ कार्यान्वयन के लिए, यह एक गंभीर सुरक्षा जोखिम है।)
मुझे डर है कि मेरे पास सॉर्टिंग की लागत के लिए डेटा नहीं है, लेकिन मैं कहूंगा कि रेट्रोएक्टिव सॉर्टिंग आप जो बेहतर करने की कोशिश कर रहे हैं उसके सार को कैप्चर करती है और इसलिए बेहतर विकल्प है। पोस्ट-सॉर्टिंग बनाम प्राथमिकता कतार प्रबंधन की सापेक्ष जटिलता के आधार पर, मैं कहूंगा कि पोस्ट-सॉर्टिंग तेज होना चाहिए। लेकिन फिर, आपको इसका परीक्षण करना चाहिए।
मैं कुछ वस्तुओं को उत्पन्न कर रहा हूं जिन्हें मुझे अंत में क्रमबद्ध करने की आवश्यकता है। मैं सोच रहा था, जटिलता के मामले में तेज़ी से क्या है: उन्हें प्राथमिकता-कतार या समान डेटा संरचना में सीधे डालना, या अंत में एक प्रकार एल्गोरिदम का उपयोग करना?
हम शायद इसे ऊपर से ढंक चुके हैं।
एक और सवाल है जिसे आपने नहीं पूछा था, हालांकि। और शायद आप पहले से ही जवाब जानते हैं। यह स्थिरता का सवाल है। सी ++ एसटीएल का कहना है कि प्राथमिकता कतार को "सख्त कमजोर" आदेश बनाए रखना चाहिए। इसका मतलब है कि समान प्राथमिकता के तत्व अतुलनीय हैं और किसी भी क्रम में रखा जा सकता है, क्योंकि "कुल आदेश" के विपरीत जहां प्रत्येक तत्व तुलनीय है। (here ऑर्डर करने का एक अच्छा विवरण है।) सॉर्टिंग में, "सख्त कमजोर" एक अस्थिर प्रकार के समान होता है और "कुल क्रम" स्थिर प्रकार के समान होता है।
उपरोक्त यह है कि यदि समान प्राथमिकता के तत्व उसी क्रम में रहना चाहिए तो आपने उन्हें अपनी डेटा संरचना में धक्का दिया है, तो आपको एक स्थिर प्रकार या कुल क्रम की आवश्यकता है। यदि आप सी ++ एसटीएल का उपयोग करने की योजना बना रहे हैं, तो आपके पास केवल एक विकल्प है। प्राथमिकता कतार एक सख्त कमजोर आदेश का उपयोग करती है, इसलिए वे यहां बेकार हैं, लेकिन एसटीएल एल्गोरिदम पुस्तकालय में "स्थिर_आर्ट" एल्गोरिदम काम पूरा कर लेगा।
मुझे आशा है कि इस मदद करता है। मुझे बताएं कि क्या आप किसी भी कागजात का एक प्रतिलिपि चाहते हैं या स्पष्टीकरण चाहते हैं। :-)
डेटा की मात्रा के बारे में कोई विवरण? क्या आपको एक पूर्ण प्रकार/स्थिर सॉर्ट या आंशिक सॉर्ट/nth_element की आवश्यकता होगी? – MadH
मुझे एक पूर्ण प्रकार की आवश्यकता है, लेकिन इसे स्थिर नहीं होना चाहिए। मैं विशिष्ट समस्या आकार के प्रदर्शन की तुलना में जटिलता में अधिक रूचि रखता हूं, इसलिए मैंने किसी को निर्दिष्ट नहीं किया है। –
लगभग एक डुप्लिकेट (लेकिन जावा के लिए, इसलिए मैंने बंद करने के लिए वोट नहीं दिया): http://stackoverflow.com/questions/3607593/is-it-faster-to-add-to-a-collection-then-sort- यह-या-ऐड-टू-ए-सॉर्ट-संग्रह – Thilo