欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python数据结构之堆并实现从海量数据中寻找最大的K个

程序员文章站 2024-03-15 21:16:48
...

1.堆其实是完全二叉树,有最大堆和最小堆

最大堆:对每个非叶子结点V,V的值都比它的两个孩子大

最大堆支持每次 pop 操作获取最大的元素,最小堆获取最小元素

常见问题:用堆来完成 topk 问题,从海量数字中寻找最大的 K 个

import heapq

class TopK:
	'''
	获取大量元素 topk 大个元素,固定内存
	思路:
	1.先放入元素前 K 个建立最小堆
	2.迭代剩余元素:
		如果当前元素小于堆顶元素,跳过该元素(肯定不是前 K 大)
		否则替换堆顶元素为当前元素,并重新调整堆
	'''
	
	def __init__(self, iterable, k):
		self.minheap = []         # 定义最小堆
		self.capacity = k         # 最小堆容量为k个元素
		self.iterable = iterable
	
	def push(self, val):
		if len(self.minheap) >= self.capacity:
			min_val = self.minheap[0]  
			if val < min_val: 
				# 当然你可以直接 if val > min_val操作,这里我只是显示指出跳过这个元素
				pass
			else:
				# 返回并且pop堆顶最小值,推入新的 val 值并调整堆
				heapq.heapreplace(self.minheap, val)
		else:
			# 前面k个元素直接放入minheap
			heapq.heappush(self.minheap, val)
	
	def get_topk(self):
		'''获取topk的值'''
		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)
	print(_.get_topk())

test()

输出结果:

    [990, 991, 993, 992, 997, 996, 994, 995, 998, 999]