不忘初心,砥砺前行
作者 | 陌无崖
转载请联系授权
导语
昨天分享了寻找最小k个数的算法是Go寻找数组中最小的k个数——全部排序和部分排序,那么有没有更为迅速的方法呢?今天就来分享关于如何使用最大堆进行解决。
什么是堆
我太懒了,直接上我画好的思维导图吧哈哈,获取高清的也可以关注我的公众号,后台回复【堆】
思路设计
知道了如上定义,我们就可以将容量为K的最大堆存储我们的最小k个数,因此我们仍然可以按照之前的方法假设堆中存储的仍然是最小的k个数(不懂的可以看我的上一篇文章),再通过比较替换或不替换堆来最终找到我们的最小的k个数。此解法与解法二类似但由于使用堆时进行查找或更新的时间复杂度降低到了O(logk),那么通过遍历剩余的n-k个数,那么最坏情况下的时间复杂度为O(k + (n-k)logk) = O(nlogk)。这里的O(k)为建堆时的时间复杂度。
因此我