标签:cap 一个 top lis class dom lan 直接 迭代
import heapq
class TopK:
"""
获取大量元素 topk 大个元素,固定内存
思路:
1. 先让入元素前 k 个建立一个最小堆
2. 迭代剩余元素:
如果当前元素小于堆顶元素,跳过该元素
否则替换堆顶元素为当前元素,并重新调整堆
"""
def __init__(self, iterable, k):
self.minheap = []
self.capacity = k
self.iterable = iterable
def push(self, val):
if len(self.minheap) >= self.capacity:
min_val = self.minheap[0]
if val < min_val:
pass
else:
heapq.heapreplace(self.minheap, val) # 返回并且pop堆顶最小值,推入新的 val 并调整堆
else:
heapq.heappush(self.minheap, val) # 前面 k 个值直接放入minheap
def get_topk(self):
for val in self.iterable:
self.push(val)
return self.minheap
def test():
import random
i = list(range(1000))
random.shuffle(i)
_ = TopK(i, 10)
res = _.get_topk()
print(sorted(res))
test()
标签:cap 一个 top lis class dom lan 直接 迭代
原文地址:https://www.cnblogs.com/jiaoran/p/14589864.html