基本思路:
1. 用最多K个元素的最大堆max_heap记录最终结果
2. 最大堆的max_heap的所有叶子节点,组成最小堆组成最小堆min_heap
3. 该思路的提出,受启发于逆波兰式算法,双数据结构解决表达式计算问题
比较优势:
1. 众所周知,用快速排序的思想,也可以解出N个数中的前K个最大数,但该算法的好坏,取决于PIVOIT点,对于该点的取舍,目前已知最好策略是取N个数中的随机某个元素。所以需要的轮次比较多。本算法一轮,就能找出最大K个元素,复杂度O(N)(视K为常数的情况下)。
2. 该算法可以对付N超级大(亿级别),K相对较小的情况,因为内存复杂度只有O(K)
算法步骤如下:
很容易看到,该算法的时间复杂度为O( Nlgk), 空音复杂度为O(K), 特别适用于K相对较小。
对该算法有不解的,可以联系微信:151305546,谢谢!
网友评论