传统弱校HFUT的蒟蒻,真相只有一个

算法复习:topK问题

维护一个小根堆寻找最大的K个元素,不会改变存储空间的内容,时间复杂度o(nlogK),空间复杂度o(K)

0903加,一种优化方法:维护一个K个值的小顶堆,每次发现堆外值大于堆顶,就把堆顶替换成这个大值,重新维护堆平衡,直到最后,这个堆就是topk

 

multiset<int,less<int>>维护一个小根堆

multiset<int,greater<int>>维护一个大根堆

multiset<int>默认维护小根堆

#include<iostream>
#include<vector>
#include<string>
#include<stdlib.h>
#include<set>
#include<map>
using namespace std;
#define MAX 999999
vector<int> get_TopK(vector<int>&nums,int K)
{
    if(nums.size()<=K||K==0)
        return nums;
    multiset<int,less<int> >mybag;
    multiset<int,less<int> >::iterator it;
    vector<int> result;
    for(int i=0;i<nums.size();i++)
    {
        if(mybag.size()<K)
            mybag.insert(nums[i]);
        else
        {
            it=mybag.begin();
            if(*it<nums[i])
            {
                mybag.erase(it);
                mybag.insert(nums[i]);
            }
        }
    }
    for(it=mybag.begin();it!=mybag.end();it++)
    {
        result.push_back(*it);
    }
    return result;
}
int main()
{
    int K,number;
    cin>>K>>number;
    vector<int>nums;
    for(int i=0;i<number;i++)
    {
        int tmp=0;
        cin>>tmp;
        nums.push_back(tmp);
    }
    vector<int>tmp=get_TopK(nums,K);
    for(int i=K-1;i>=0;i--)
        cout<<tmp[i]<<" ";
    cout<<endl;
    return 0;
}

/*
5 11
1 3 5 2 7 9 11 3 4 6 8
*/

 

posted @ 2020-03-24 20:37  未名亚柳  阅读(212)  评论(0编辑  收藏  举报