सुझाए गए "हेप के शीर्ष पर चोटी" एल्गोरिदम के अलावा, जो आपको एन वस्तुओं के शीर्ष-मीटर प्राप्त करने के लिए ओ (एन लॉग एम) जटिलता देता है, यहां दो और समाधान हैं।
समाधान 1: एक फाइबोनैकी ढेर का उपयोग करें।
जेडीके की प्राथमिकता क्यूई कार्यान्वयन एक संतुलित बाइनरी ढेर है। आपको Fibonacci heap कार्यान्वयन से अधिक प्रदर्शन निचोड़ने में सक्षम होना चाहिए। यह एक बार बाइनरी ढेर में डालने के दौरान निरंतर समय सम्मिलित किया जाएगा, ढेर के आकार में जटिलता Ω (लॉग एन) है। यदि आप हर तत्व के लिए ऐसा कर रहे हैं, तो आप Ω (एन लॉग एन) पर हैं। एक फाइब ढेर का उपयोग कर एन वस्तुओं के शीर्ष-एम को ढूंढना जटिलता ओ (एन + एम लॉग एन) है। इस सुझाव को केवल ढेर में एम तत्वों को सम्मिलित करने के सुझाव के साथ संयोजित करें, और आपके पास ओ (एन + एम लॉग एम) है, जो आपको प्राप्त होने वाले रैखिक समय के करीब है।
समाधान 2: सूची एम बार को पार करें।
आपको ओ (एन) समय में एक सेट में केथ-सबसे बड़ा तत्व प्राप्त करने में सक्षम होना चाहिए। बस सूची में सबकुछ पढ़ें और निम्न कार्य करें:
kthLargest(k, xs)
Pick a random pivot element p from the list
(the first one will do if your list is already random).
Go over the set once and group it into two lists.
Left: smaller than p.
Right: Larger or equal to p.
If the Right list is shorter than k, return kthLargest(k - right.size, Left)
If the Right list is longer than k, return kthLargest(k, right)
Otherwise, return p.
जो आपको ओ (एन) समय देता है। उस समय को चलाना, आप समय (ओएम) में अपने सेट में शीर्ष-एम ऑब्जेक्ट्स प्राप्त करने में सक्षम होना चाहिए, जो पर्याप्त रूप से बड़े n और पर्याप्त छोटे मीटर के लिए n लॉग n से सख्ती से कम होगा। उदाहरण के लिए, दस लाख से अधिक वस्तुओं में शीर्ष -10 प्राप्त करने से बाइनरी ढेर प्राथमिकता कतार का उपयोग करने में आधा समय लगेगा, अन्य सभी चीजें बराबर होंगी।
क्या आपने इस कोड पर एक प्रोफाइलर चलाया है? आपका तुलनित्र कैसे लिखा गया है? –
सार्वजनिक पूर्णांक तुलना (ListElement मैं, ListElement जे) { \t \t \t \t \t \t \t अगर (i.getValue() - j.getValue()> 0) वापसी 1; अन्य वापसी -1; } – BigG
आईडी अत्यधिक सुझाव देता है कि आप अपना कोड प्रोफाइल करें और पता लगाएं कि आपके कोड को धीमा चलाने के लिए वास्तव में क्या चल रहा है। कोई कोड दिखाए बिना, और कोई अतिरिक्त जानकारी इस प्रश्न का उत्तर देना मुश्किल है। क्या हिस्सा धीमा चल रहा है? –