2010-03-21 27 views
6

में कौन सी संख्याएं सबसे अधिक दिखाई देती हैं, मेरे पास वेक्टर में कुछ संख्याएं संग्रहीत हैं। मैं यह जानना चाहता हूं कि वेक्टर में कौन सा नंबर सबसे अधिक दिखाई देता है।एक वेक्टर

क्या कोई आसान/तेज़ एल्गोरिदम (एसटीएल या जो कुछ भी) ऐसा करता है?

+0

जैसे प्रश्न देखें: http://stackoverflow.com/questions/1204313/counting-occurences-in-a-vector, http://stackoverflow.com/questions/2184336/how-to-get-the-most -represented-object-from-an-array – outis

उत्तर

6

इसे सॉर्ट करें, फिर इसके माध्यम से पुन: प्रयास करें और एक काउंटर रखें जो आप बढ़ते हैं जब वर्तमान संख्या पिछले नंबर के समान होती है और अन्यथा 0 पर रीसेट होती है। इस बात का भी ध्यान रखें कि इस काउंटर का उच्चतम मूल्य क्या था और उस मूल्य पर पहुंचने पर वर्तमान संख्या क्या थी। यह समाधान O(n log n) है (इस प्रकार के कारण)।

वैकल्पिक रूप से आप int से int (या यदि आप जानते हैं कि संख्याएं सीमित सीमा के भीतर हैं, तो आप केवल एक सरणी का उपयोग कर सकते हैं) और वेक्टर पर फिर से उपयोग कर सकते हैं, the_hashmap[current_number] प्रत्येक नंबर के लिए 1 से बढ़ाकर। बाद में हैशप के माध्यम से अपना सबसे बड़ा मूल्य (और इससे संबंधित कुंजी) ढूंढने के लिए पुन: प्रयास करें। इसके लिए हैशपैप डेटास्ट्रक्चर की आवश्यकता है हालांकि (जब तक आप सरणी का उपयोग नहीं कर सकते हैं जो तेजी से भी होगा), जो एसटीएल का हिस्सा नहीं है।

+0

बस एसटीएल के प्रकार का उपयोग करके सॉर्ट करने के लिए स्पष्ट जोड़ने के लिए: http://www.cplusplus.com/reference/algorithm/sort/ –

+3

@ स्टीव 314: unordered_map आगामी में होगा मानक। यह 2003 (यानी वर्तमान) मानक में नहीं है। – sepp2k

+0

वियर्ड - मुझे किसी भी तरह का विचार आया कि TR1 2003 "पहला टेक्स्ट संशोधन" था। – Steve314

0

यह मैं कैसे यह किया है:

int max=0,mostvalue=a[0]; 
    for(i=0;i<a.size();i++) 
    { 
     co = (int)count(a.begin(), a.end(), a[i]); 
     if(co > max) 
     {  max = co; 
       mostvalue = a[i]; 
     } 
    } 

मैं बस नहीं जानता कि यह कितनी तेजी से है, अर्थात हे()? अगर कोई इसकी गणना कर सकता है और इसे यहां पोस्ट कर सकता है तो वह ठीक होगा।

int max = 0; 
int most_common = -1; 
map<int,int> m; 
for (vi = v.begin(); vi != v.end(); vi++) { 
    m[*vi]++; 
    if (m[*vi] > max) { 
    max = m[*vi]; 
    most_common = *vi; 
    } 
} 

यह और अधिक स्मृति की आवश्यकता है और एक बहुत ही इसी तरह की उम्मीद क्रम है:

+3

यह ओ (एन * एन) है, इसलिए सबसे कुशल विधि नहीं है लेकिन यह केवल पढ़ने के लिए है और यदि यह महत्वपूर्ण है तो कोई अतिरिक्त संग्रहण की आवश्यकता नहीं है। –

+2

यह ओ (एन^2) है, क्योंकि हर बार जब आप गिनती करते हैं, तो यह वेक्टर में हर तत्व को देखता है। यह ओ (एन) में किया जा सकता है (http://stackoverflow.com/questions/512590/computing-the-statistic-mode/512601#512601) –

3

आप अपने वेक्टर v छँटाई से बचना चाहते हैं, एक नक्शा का उपयोग करें। आवश्यक स्मृति एक पूर्ण वेक्टर प्रतिलिपि के क्रम पर होनी चाहिए, यदि बहुत अधिक डुप्लिकेट प्रविष्टियां हैं।