问题
现在有n个数(n>10000),设计算法,按大小顺序得到前10m大的数。
- 应用场景:榜单TOP 10
解决方法
- 先排序,取前 10 个数 O(nlogn)
- 只留前 10 个数,开一个长度为 10 的列表,用插入排序取出 10 个数,来一个数和列表最后一个数比较,如果比它更小就扔掉 O(nm)不适用与 m 特别大的时候
- 堆 O(nlogm)
用堆解决思路:
- 取列表前m个元素建立一个小根堆。堆顶就是目前第m大的数。
- 依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆进行一次调整;
- 遍历列表所有元素后,倒序弹出堆顶。
1 | def sift(data, low, high): |
- Python内置模块——heapq
1 | import heapq |
优先队列:一些元素的集合,POP操作每次执行都会从优先队列中弹出最大(或最小)的元素。
堆——优先队列
参考
1 | # 位运算 |