C++(TopK问题)——字符串出现次数

对于top k问题:

1.既然是属于排序问题,最快能想到的就是快排,排序后取出前k个,这种针对数据量不大的情况快速可行。时间复杂度O(nlogn)

2.采用快排的 partition 划分思想,每次划分,若中间位置为k则左边部分即为top k。时间复杂度是 O(n) ,但是对于在海量数据的情况下,最主要的就是内存问题,没办法一次性将数据全部加载入内存,这个时候这个方法就不再适用。还有一点就是这种思路需要我们修改输入的数组,这也是值得注意的一点。

3.采用一个大小为 K 的小顶堆,依次将数据放入堆中,当堆的大小满了的时候,将堆顶元素与下一个数比较:如果大于堆顶元素,则将当前的堆顶元素去除,并将该元素插入堆中。遍历完全部数据,Top K 的数据就都在堆里面了。如果是求前 K 个最小的数,只需要改为大顶堆即可。

C++中可以用优先队列   priority_queue< type, container, function>

 

priority_queue<int,vector<int>,less<int> > big_heap;     //大顶堆

也可以用 priority_queue<int> big_heap;    //一般默认大顶堆,

priority_queue<int,vector<int>,greater<int> > small_heap;    //小顶堆

如果我们想要自定义比较方式,可以写结构体重载()运算符 【eg:见下面题目】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值