C++实现数组中出现最频繁的前top k个元素

来源:互联网 发布:中科信证券软件 编辑:程序博客网 时间:2024/06/05 00:59

要求: 时间复杂度小于等于 nlogn.

算法解题思路:

1, 由于原始数组是杂乱无序的, 所以 统计数组中元素出现的次数时间复杂度达到了n^2, 不符合题意.

2, 在统计数组中的元素出现次数之前, 先对数组进行排序, 用时间复杂度是 nlogn的排序算法进行排序,  在这里用C++ 中函数库STL中的sort直接排序, 关于STL中sort实现(成熟的快速排序算法, 结合了内插排序,具体读读STL中实现).

3. 从排好序的第一个元素开始扫描,  统计每个元素出现的次数,时间复杂度为n.

4. 由3给出的每个元素的统计情况,  与2类似的方法进行从大到小排序,  取出前K个对应元素即可,时间复杂度nlogn.

附源代码:

#include<vector>#include<algorithm>#include<cstdlib>#include<iostream>using namespace std;/*this  practice C++  knowledge:vector  : useage,     memory management, iteratoralgorithm:sort(), user identify functioncstdlib: creating random number*/struct key_value{     int key;     int num;};bool compare(const key_value& k1, const key_value& k2) {        return k1.num>k2.num;}class Solution {    public:        vector<int> topKFrequent(vector<int>& nums, int k) {            int j=0;            int number=1;            int num=nums.size();            vector<key_value> topk;            vector<int>* key=new  vector<int>(0);//very important            sort(nums.begin(),nums.end());//原始数组排序            for(int i=1;i<num;i++){                if(nums[i]==nums[j]){                    number++;                }                else{                    key_value kv;                    kv.key=nums[j];                    kv.num=number;                    topk.push_back(kv);                    number=1;                    j=i;                }            }//统计元素的频数            key_value kv;            kv.key=nums[j];            kv.num=number;            topk.push_back(kv);//统计最后一个元素            sort(topk.begin(),topk.end(), compare);            j=1;            for(vector<key_value>::iterator it=topk.begin();it!=topk.end()&&(j<=k);it++){              key->push_back((*it).key);              j++;            }//前K个元素取出来            return (*key);        }};int main(){    Solution sl;    vector<int>::iterator it;    vector<int> v;    for(int i=0;i<10;i++)           v.push_back(rand()%10+1);    vector<int> topk=sl.topKFrequent(v,2);//取出数组中出现次数最频繁的前K个元素.,这里是2    for(it=topk.begin();it!=topk.end();it++)      cout<<(*it)<<" , ";    cout<<endl;    return 0;}


0 0
原创粉丝点击