2012-12-10 18 views
8

Set की ऑब्जेक्ट को देखते हुए, मैं इसके सभी (अनियंत्रित) जोड़े से घूमना चाहता हूं।एक सेट के सभी जोड़े को कुशलतापूर्वक कैसे प्राप्त करें?

उदाहरण: सेट = {1, 2, 3}, जोड़े: (1, 2), (1, 3), (2, 3)।

जब एक Vector<Integer> के साथ काम कर, एक-एक तत्व के सूचकांक की मदद से इस लक्ष्य को हासिल कर सकते हैं:

for (int i = 0; i < vector.size(); i++) 
    for (int j = i + 1; j < vector.size(); j++) 
    // Do something with vector.get(i) and vector.get(j) 

लेकिन एक Set<Integer> में तत्वों कोई सूचकांक होते हैं।

अब तक का सबसे अच्छा समाधान, Set को Vector में परिवर्तित करना और ऊपर दिए गए समाधान का उपयोग करना है।

क्या कोई और अधिक कुशल/सीधा समाधान है?

+0

आपको केवल नेस्टेड लूप में वेक्टर/सरणी की आवश्यकता है। लेकिन इसके अलावा, मुझे लगता है कि यह सबसे अच्छा समाधान है। – Jochen

+4

वेक्टर? एक सूची क्यों नहीं? –

+0

@ जोकन मुझे लगता है कि सूची prefered समाधान –

उत्तर

9
List<Integer> list = new ArrayList<Integer>(mySet); 
for (int i = 0; i < list .size(); i++) 
    for (int j = i + 1; j < list .size(); j++) 
     // Do something with vector.get(i) and vector.get(j) 
+2

ओप में भी कार्यात्मक समाधान देखें उसे एक सेट के साथ एक ही चीज़ करने की ज़रूरत है, वह पहले से ही एक सूची के साथ कैसे करना है जानता है। # – PermGenError

+0

धन्यवाद। लेकिन जैसा कि मैंने पहले ही कहा है, यह समाधान काम करता है। क्या कनवर्ट किए बिना कोई और है (और शायद अधिक कुशल एक)? –

+0

आप इसे और अधिक कुशल होने की अपेक्षा कैसे करते हैं, यह 'ओ (एन)' होगा, इसलिए नमूना कोड भी है। –

1

इस एल्गोरिथ्म = n (n -1)/2 के लिए जटिलता के संदर्भ में, इस प्रकार O (n^2) सबसे अच्छा आप प्राप्त कर सकते हैं (अनुक्रमिक) है।

हालांकि, यदि आपका सेट वास्तविक बड़ा है, तो एक सेट जो केवल रैम में फिट बैठता है। आप टाइल ब्लॉक का उपयोग करके मैट्रिक्स गुणा में किए गए कार्यों के समान ब्लॉक तरीके से जोड़ी की गणना करके एल्गोरिदम अनुकूलित कर सकते हैं। इस तरह आप कैश मिस के% को कम कर सकते हैं और इसलिए समग्र प्रदर्शन में वृद्धि कर सकते हैं।

इसके अलावा, आप समानांतरता और थ्रेड/प्रक्रियाओं के बीच काम को विभाजित कर सकते हैं क्योंकि एल्गोरिदम शर्मनाक समानांतर प्रतीत होता है।

+0

क्या आप टाइल ब्लॉक ' –

+0

का उपयोग करके मैट्रिक्स गुणा में किए गए कार्यों के समान एक ब्लॉक तरीके से जोड़ी की गणना करने पर विस्तार कर सकते हैं, लेकिन टिप्पणी के द्वारा समझाया जा सकता है लेकिन आप इस तकनीक का उपयोग gnu: http: // www में देख सकते हैं। umiacs.umd.edu/~ramani/cmsc828e_gpusci/Lecture5.pdf लेकिन सीपीयू में भी एक ही प्रयोग के समान है। और https://en.wikipedia.org/wiki/Loop_tiling – dreamcrash

संबंधित मुद्दे