zoukankan      html  css  js  c++  java
  • 算法复习: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
    */
  • 相关阅读:
    An introduction to parsing text in Haskell with Parsec
    Kafka and ZooKeeper
    Kotlin + Anko for Android
    LibGDX
    OpenCV
    大中型网站技术实践系列
    Go by Example
    Benchmarks for the Top Server-Side Swift Frameworks vs. Node.js
    The Languages and Frameworks You Should Learn in 2017
    RabbitMQ
  • 原文地址:https://www.cnblogs.com/dzzy/p/12561688.html
Copyright © 2011-2022 走看看