内容会持续更新,有错误的地方欢迎指正,谢谢!
在一堆数中求其第 k 大或第 k 小的问题,简称 TOP-K 问题。目前解决 TOP-K 问题最有效的算法即是 “BFPRT 算法”,最坏时间复杂度为 O(n)。
在首次接触 TOP-K 问题时,我们的第一反应就是可以先对所有数据进行一次排序,然后取其前 k 即可,但是这么做有两个问题:
- 快速排序的平均复杂度为 O(nlogn),但最坏时间复杂度为 O(n2),不能始终保证较好的复杂度。
- 我们只需要前 k 大的,而对其余不需要的数也进行了排序,浪费了大量排序时间。
BFPRT 算法的做法就是在快速排序的基础上,通过判断主元位置与 k 的大小使递归的规模变小,其次通过修改快速排序中主元的选取方法来降低快速排序在最坏情况下的时间复杂度。
求第K大问题的代码请见:http://blog.youkuaiyun.com/billcyj/article/details/79008724
相关习题
1、数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
2、春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
测试样例:
[1,2,3,2,2],5
返回:2
经过分析不难看出,如果解决了Top K问题,上述两题就很容易解决了。