方法1:
用python中的heapq实现
import heapq
import random
class TopKHeap(object):
def __init__(self,k):
self.data=[]
self.k=k
def push(self,num):
if len(self.data)<self.k:
heapq.heappush(self.data,num)
else:
top_min=self.data[0]
if num>top_min:
heapq.heapreplace(self.data,num)
def topk(self):
return list(reversed([heapq.heappop(self.data) for i in range(self.k)]))
if __name__ == '__main__':
heap=TopKHeap(10)
for i in range(100000):
n=random.randint(0,100000)
# print(n,'------------')
heap.push(n)
print(heap.topk())
方法2:
思路一样,就是自己写个最大堆,
步骤:
- 先用前k个数据建立好一个最小堆(k个结点)
- 然后对剩下的每一个数和根结点比较,比根结点大则替换根结点,替换之后此时就不是最小堆,所以需要再次建堆,使得变成最小堆&#