मैं विशाल संग्रह से शीर्ष एन तत्वों को खोजने के लिए जावा में एक मेमोरी-कुशल तरीका ढूंढ रहा हूं। उदाहरण के लिए, मेरे पास एक शब्द, एक दूरी() विधि है, और "सभी" शब्दों का संग्रह है। मैंने एक कक्षा जोड़ी लागू की है जो तुलना करता है() ताकि जोड़े को उनके मूल्यों से क्रमबद्ध किया जा सके।जावा स्ट्रीम का उपयोग कर MinMaxPriorityQueue
धाराओं का उपयोग करना, मेरी भोली समाधान इस तरह दिखता है:
double distance(String word1, String word2){
...
}
Collection<String> words = ...;
String word = "...";
words.stream()
.map(w -> new Pair<String, Double>(w, distance(word, w)))
.sorted()
.limit(n);
मेरी समझ के लिए, इस पर कार्रवाई और intermediately शब्दों में प्रत्येक तत्व की दुकान इतना है कि यह सीमा लागू करने से पहले हल हो सकते हैं()। हालांकि, यह एक संग्रह रखने के लिए अधिक स्मृति-कुशल है जो एन तत्वों को संग्रहीत करता है और जब भी कोई नया तत्व जोड़ा जाता है, तो यह सबसे छोटा तत्व (तुलनीय वस्तु के प्राकृतिक क्रम के अनुसार) को हटा देता है और इस प्रकार एन (या एन + 1) से बड़ा नहीं होता है।)।
यह ठीक है कि अमरूद MinMaxPriorityQueue करता है। इस प्रकार, ऊपर समस्या के लिए अपने मौजूदा सबसे अच्छा समाधान यह है:
Queue<Pair<String, Double>> neighbours = MinMaxPriorityQueue.maximumSize(n).create();
words.stream()
.forEach(w -> neighbours.add(new Pair<String, Double>(w, distance(word, w)));
शीर्ष n तत्वों का छंटाई एक धारा या सूची में कतार परिवर्तित करने के बाद किया जाना रहता है, लेकिन यह कोई मुद्दा n है के बाद से नहीं है अपेक्षाकृत छोटा।
मेरा प्रश्न है: क्या धाराओं का उपयोग करके ऐसा करने का कोई तरीका है?
यह 'MinMaxPriorityQueue' के सभी बिंदुओं पर नहीं है: 'MinMaxPriorityQueue' का एकमात्र बिंदु तब होता है जब आपको वास्तव में सबसे बड़ी और निम्नतम तत्वों तक पहुंचने के लिए डबल-एंड प्राथमिकता कतार की आवश्यकता होती है, जो ऐसा प्रतीत नहीं होता है यहां मामला 'अधिकतम आकार' पहलू डेटा संरचना का बिंदु नहीं है, और यह गंभीर रूप से अक्षम होगा। अमरूद के 'ऑर्डरिंग.greatestOf' फ़ंक्शन को इस सटीक उपयोग के मामले के लिए कड़ाई से अनुकूलित किया गया है, और ओ (एन लॉग एन) के बजाय ओ (एन) समय लेता है। –
(गुवा के भविष्य संस्करणों में 'ऑर्डरिंग.greatestOf' का संस्करण होगा जो विशेष रूप से जावा 8 कलेक्टर एपीआई से मेल खाने के लिए डिज़ाइन किया गया है।) –
पॉइंटर के लिए धन्यवाद! मुझे ऑर्डरिंग.greatestOf() का उपयोग करने के लिए पहले एक संग्रह में सभी तत्वों को संग्रहीत किए बिना एक तरीका नहीं दिख रहा है, क्या कोई है? या जैसा कि आपने उल्लेख किया है, भविष्य के संस्करणों में यह केवल संभव होगा? – Carsten