题目:给出N个无序的数,然后找出其中最大的k个数
解题思路:
首先测试数据有可能会有一亿个数,数据量特别的大,数据库不可能存储这么多的数据。如果直接sort排序,NlogN时间复杂度实在是太高,大于10^9。我们可以考虑对数据进行分块读取,每次读取的数据块大小应大于k。
不如先假设第一次读取的数据块前k个数最大,然后把k个数建成最小二叉堆。然后从第k+1个数开始,每个数都与堆顶的数值进行比较,如果数字i大于堆顶则把堆顶的元素的元素替换成i,再调整一次堆。最后读取完数据之后,这个二叉堆里面的元素就是从小到大排序好的最大k个数。
时间复杂度:O(NlogK)