Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में Top K Frequent Words


मान लीजिए हमारे पास शब्दों की एक गैर-खाली सूची है; हमें k सबसे अधिक बार आने वाले तत्व ढूंढने हैं। हमारा उत्तर उच्चतम से निम्नतम आवृत्ति के अनुसार क्रमबद्ध होना चाहिए। जब दो शब्दों की आवृत्ति समान होती है, तो कम वर्णमाला क्रम वाला शब्द पहले रखा जाएगा। इसलिए यदि सरणी ['the', 'sky', 'is', 'blue', 'the', 'weather', 'is', 'comfortable'] जैसी है, तो सबसे अधिक बार आने वाले शब्द ["is","the","blue"] हैं।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • m नामक एक मैप परिभाषित करें
  • v नामक एक प्राथमिकता कतार (priority queue) बनाएं
  • i := 0 से n तक, जहां n शब्द सरणी का आकार है, फिर m[words[i]] को 1 से बढ़ाएं
  • मैप में प्रत्येक तत्व e के लिए
    • यदि v का आकार < k है, तो e को v में सम्मिलित करें
    • अन्यथा यदि v.top का मान < e का मान है, तो v से शीर्ष तत्व हटाएं और e को v में सम्मिलित करें।
    • अन्यथा यदि v.top का मान = e का मान है और v.top की कुंजी > e की कुंजी है, तो v से शीर्ष तत्व हटाएं, e को v में सम्मिलित करें
  • res नामक एक सरणी परिभाषित करें
  • जब तक v खाली नहीं है,
    • temp := v का शीर्ष
    • v से शीर्ष हटाएं
    • temp की कुंजी को res सरणी में सम्मिलित करें
  • res सरणी को उलट दें
  • res लौटाएं

उदाहरण (C++)

बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें -

#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){    cout << "[";    for(int i = 0; i<v.size(); i++){       cout << v[i] << ", ";    }    cout << "]"<<endl; } struct Comparator{    bool operator()(pair <string ,int> a, pair <string, int> b){       if(a.second != b.second) return !(a.second < b.second);          return !(a.first > b.first);    } }; class Solution { public:    static bool cmp(pair <string, int> a, pair <string, int> b){       if(a.second != b.second) return a.second > b.second;;          return a.first < b.first;    }    vector<string> topKFrequent(vector<string>& words, int k) {       map<string, int> m;       priority_queue < pair <string, int>, vector < pair <string, int> >, Comparator > v;       for(int i = 0; i < words.size(); i++){          m[words[i]]++;       }       map<string, int> :: iterator i = m.begin();       while(i != m.end()){          if(v.size() < k){             v.push(*i);          }          else if(v.top().second < i->second){             v.pop();             v.push(*i);          }          else if(v.top().second == i->second && v.top().first > i->first){             v.pop();             v.push(*i);          }          i++;       }       vector <string> res;       while(!v.empty()){          pair <string, int> temp = v.top();          v.pop();          res.push_back(temp.first);       }       reverse(res.begin(), res.end());       return res;    } }; main(){    Solution ob;    vector<string> v = {"the", "sky", "is", "blue", "the", "weather", "is", "comfortable"};    print_vector(ob.topKFrequent(v, 3)); }

इनपुट

["the", "sky", "is", "blue", "the", "weather", "is", "comfortable"] 3

आउटपुट

["is","the","blue"]

  1. - लिनक्स पर C++ के लिए शीर्ष IDE

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। यहां लिनक्स के लिए सर्वश्रेष्ठ C/C++ IDEs की सूची दी गई है। NetBeans

  1. - विंडोज पर C++ के लिए शीर्ष IDE

    बड़े प्रोजेक्ट्स को केवल टेक्स्ट एडिटर्स पर प्रबंधित करना मुश्किल होता है। ऐसे मामलों में IDE का उपयोग करने से आप अधिक उत्पादक और कम निराश होंगे। विभिन्न प्रकार के IDE उपलब्ध हैं और आपको अपनी आवश्यकताओं के अनुरूप सही चुनना चाहिए। यहां विंडोज के लिए सर्वश्रेष्ठ C/C++ IDEs की सूची दी गई है। Visual S

  1. - पायथन में टॉप K फ्रीक्वेंट एलिमेंट्स

    मान लीजिए हमारे पास पूर्णांक संख्याओं का एक नॉन-ऐम्प्टी ऐरे है। हमें kवें सबसे अधिक फ्रीक्वेंट एलिमेंट्स लौटाने हैं। इसलिए यदि एलिमेंट्स [1,1,1,1,2,2,3,3,3] हैं और k = 2, तो परिणाम [1, 3] होगा। औपचारिक रूप से फ़ंक्शन को निम्न करना चाहिए - num_freq = एक खाली मैप, freq_list := एक खाली मैप nums में प्