topK

97 阅读1分钟

image.png

公众号文章,自己学习用

排序是最容易想到的方法,将n个数排序之后,取出最大的k个,即为所得。

伪代码

sort(arr, 1, n);

return arr[1, k];

时间复杂度:O(n*lg(n))

是否有更简单的 比如局部排序

伪代码

for(i=1 to k){

         bubble_find_max(arr,i);

}

return arr[1, k];

时间复杂度:O(n*k)

这最大的k个元素也不需要排序呢? 小顶堆

伪代码

heap[k] = make_heap(arr[1, k]);

for(i=k+1 to n){

         adjust_heap(heep[k],arr[i]);

}

return heap[k];

时间复杂度:O(n*lg(k))

随机选择

image.png

image.png

image.png

topK 的代码

image.png

priority queue 的 重定义cmp

struct cmp{
    bool operator()(const pair<int,int>& m, const pair<int,int>& n){
        return m.second > n.second;
    }
};

用结构体cmp 重新定义比较运算符

priority_queue<pair<int,int>, vector<pair<int,int>>, cmp> q;