自平衡的有序(局部有序)数据结构,堆顶元素最大(小顶堆)或者最小(小顶堆),呈二叉树结构,父节点均大于或者小于子节点。
获取堆顶元素的时间复杂度为 O(1);删除,更新堆元素的时间复杂度为 O(logk)。
空间复杂度为 O(1),取决于堆的大小。
使用场景:
- topk 问题
- 合并有序子文件
- 堆排序,时间复杂度 nlogk
- 计算中位数,或者其它分位数(例如90分位,99分位),通过两个堆实现
top_k 问题
问题:Top-K 高频元素
给定整数数组 nums 与整数 k,返回出现频率最高的 k 个元素,顺序不限。
若有并列,返回任意一组满足条件的元素即可。
若 k 大于不同元素的数量,则返回全部不同元素。
示例:
输入:nums = [1,1,1,2,2,3], k = 2
输出:[1,2](或 [2,1])
你需要完成的内容1. 编写代码(Python)
完成实现函数,可使用标准库(如 collections, heapq),勿使用第三方库。
基于堆的代码实现:
# 时间复杂度 O(n + nlogk) = O(nlogk)
def top_k_heap(nums:[], k:int):
from heapq import nlargest
from collections import Counter
count_map = Counter(nums)
k = min(k, len(count_map))
top_k_items = nlargest(k, count_map.items(), key=lambda x: x[1])
return [num for num, _ in top_k_items]
nums = [1,1,1,2,2,3]
print(top_k_heap(nums, 2))