मैं एक बड़ी राशि (ish -> 100K) संग्रह है कि वे खरीदा है विभिन्न उत्पादों की गिनती (यह भी एक पूर्णांक के लिए एक उपयोगकर्ता पहचानकर्ता (किसी पूर्णांक) मानचित्रण।) मुझे डेटा को विभिन्न प्रकार के उत्पादों के बारे में जानने के लिए जितना संभव हो उतना कुशलतापूर्वक डेटा व्यवस्थित करने की आवश्यकता है। उदाहरण के लिए, कितने उपयोगकर्ताओं को 1 उत्पाद है, कितने उपयोगकर्ताओं को दो उत्पादों आदिकुशल तरीका पुनः आदेश देने के एक सी ++ मानचित्र आधारित संग्रह
मैं एक std::multimap
में एक std::map
से मूल डेटा पीछे करके इस प्राप्त कर ली है है है (जहां कुंजी और मान बस उलट कर रहे हैं।) मैं तो एन उत्पादों count(N)
का उपयोग कर होने उपयोगकर्ताओं की संख्या चुन सकते हैं (हालांकि मैं भी विशिष्ट एक सेट में मान संग्रहीत तो मैं मान की सही संख्या मैं पुनरावृत्ति किया गया था और उनके आदेश के बारे में सुनिश्चित किया जा सकता है)
कोड इस तरह दिखता है:
// uc is a std::map<int, int> containing the original
// mapping of user identifier to the count of different
// products that they've bought.
std::set<int> uniqueCounts;
std::multimap<int, int> cu; // This maps count to user.
for (map<int, int>::const_iterator it = uc.begin();
it != uc.end(); ++it)
{
cu.insert(std::pair<int, int>(it->second, it->first));
uniqueCounts.insert(it->second);
}
// Now write this out
for (std::set<int>::const_iterator it = uniqueCounts.begin();
it != uniqueCounts.end(); ++it)
{
std::cout << "==> There are "
<< cu.count(*it) << " users that have bought "
<< *it << " products(s)" << std::endl;
}
मैं यह महसूस करने में मदद नहीं कर सकता कि यह करने का यह सबसे प्रभावी तरीका नहीं है। किसी को यह करने की एक चालाक विधि के बारे में पता है?
मैं उस में सीमित हूं, मैं करने के लिए बूस्ट या सी ++ 11 का उपयोग नहीं कर सकता।
ओह, अगर कोई सोच रहा है, तो यह न तो होमवर्क है, न ही एक साक्षात्कार प्रश्न है।
दंडित! महान दिमाग एक जैसे सोचते हैं;) –
"यदि आवश्यक हो तो वेक्टर के आकार को बढ़ाने के लिए इस कोड को अनुकूलित करें" - जो कि सबसे सरल है, एक पंक्ति है, 'if (uc.second> = uniqueCounts.size()) uniqueCounts.resize (uc) .second +1), '। यदि वेक्टर के लिए कुछ मायने रखती हैं (उपयोगकर्ता जिन्होंने लाखों उत्पादों को खरीदा है?), 'वेक्टर' के स्थान पर 'मैप' जैसे स्पैस कंटेनर पर विचार करें। –
मुझे लगता है कि यह मल्टीमैप में intemediate डेटा की आवश्यकता है (यानी उपयोगकर्ता आईडी में मैपिंग गिनती) मुझे यकीन नहीं है कि मैं इस समय क्या करता हूं लेकिन यदि नहीं, तो यह जाने का एक अच्छा तरीका प्रतीत होता है। –