Top K是很常见的一种问题,是指在N个数的无序序列中找出最大的K个数,而其中的N往往都特别大,对于这种问题,最容易想到的办法当然就是先对其进行排序,然后直接取出最大的K的元素就行了,但是这种方法往往是不可靠的,不仅时间效率低而且空间开销大,排序是对所有数都要进行排序,而实际上,这类问题只关心最大的K个数,并不关心序列是否有序,因此,排序实际上是浪费了的很多资源都是没必要的。本文主要介绍三种TopK算法:
1.类选择排序法
为什么叫类选择排序法呢?因为这种方法很像选择排序,选择排序是抽出序列中的最大或最小值放在一端,这里也类似。算法思路:对目标序列N个数遍历,取出其中最大的数最为Top1;再次遍历剩下的N-1个数,取出其中最大的数为Top2;....再对剩下的N-K+1个数遍历,取出其中最大的数为TopK,这样就可以找到最大的K个数了。
1.1 代码实现
vector<int> TopKBySelect(vector<int>& nums,int k,int len)
{
vector<int>res;
vector<int>flag(len);
for(int i=0;i<k;i++)
{
int maxIndex=0; //保存最大数的索引
int maxNum=nums[0]; //保存最大数
for(int j=0;j<len;j++)
{
if(nums[j]>maxNum&&!flag[j]) //如果大于最大数并且没有被取出来过
{
maxNum=nums[j];
maxIndex=j;
}
}
flag[maxIndex]=-1; //将此次遍历的最大数索引标记为-1,放置再次被取出
res.push_back(maxNum); //存入该最大数
}
return res;
}
1.2 复杂度分析
时间复杂度方面,要求T