公众号文章,自己学习用
排序是最容易想到的方法,将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))
随机选择
topK 的代码
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;