python最大堆heapq,python heapq的具体用法
python中的堆
大蟒中没有独立的堆这个数据结构,但是有一个包含堆操作函数的模块(heapq)函数功能堆,x将x压入堆中堆从堆中弹出最小元素堆积让列表具备堆特征heapreplace(堆,x)弹出最小元素,并将x压入堆中nlargest(n,iter)返回国际热核聚变实验堆中n个最大的元素n最小(n,iter)返回国际热核聚变实验堆中n个最小的元素堆(堆)是一种优先队列。优先队列让你能够以任意顺序添加对象,并随时找出删除最小的元素from heapq import * from random import shuffle # a=list(range(10))a=[0,1,2,3,4,5,6,7,8,9]shuffle(a)heap=[]for I in a:heap push(heap,i)print(a) # [8,6,7,3,5,4,2,0,1,9]print(heap) # [0,1,3,2,6,7,4,8,5,9]元素的排列顺序并不像看起来那么随意,虽然不是严格排序的,但必须保证:位置我处的元素大于位置我//2处的元素(也就是位置我的值小于位置2i和2i 1的值),称为堆特征
函数堆化执行尽可能少的移位操作将列表变为合法的堆从heapq导入*从随机导入洗牌#打印(heapq .__all__)list1=[0,1,2,3,4,5,6,7,8,9]shuffle(list 1)print(list 1)#[2,6,5,7,4,1,9,3,0,8]heap ify(list 1)print(list 1)#[0,2,1,3,4,5,9,6,7,8]topK问题解法:
排序切片法:a=[-5,4,-6,9,8,10]end_3=已排序(a)[:3]top_3=已排序[3:]#或者是排序(一、反转)[:3]打印(end_3)打印(top_3)使用heapq模块的n最大和n来自heapq import *list1=[0,1,2,3,4,5,6,7,8,9]print(nlargest(4,list1))print(nsmallest(4,list1))将列表转化为heapq的堆,然后获取topK导入heapq从heapq导入*从随机导入洗牌#打印(heapq .__all__)list1=[0,1,2,3,4,5,6,7,8,9]shuffle(list 1)print(list 1)#[2,6,5,7,4,1,9,3,0,8]heapify(list 1)print(nlargest(4,list1)) # [9,8,7,6]print(nsmallest(4,list1)) # [0,1,2,3]print(list1) # [0,2,1,3,4数找到topK
使用heapq的先找到列表一前k个数;
然后使用heapq.heapify(列表1)将k个数的列表转为堆结构(heapq小顶堆);
最后拿每个数和这个堆的堆顶元素比较,如果比这个堆顶元素大则使用堆。堆位置(堆,x)替换掉堆顶的元素(反之跳过),然后在重新排列这个堆(确保堆顶为最小值);
最后堆的这k个元素就是topK。导入heapqimport随机类TopK heap(object):def _ _ init _ _(self,k):self。k=k自我。data=[]def Push(self,elem):if len(self。资料)自我。k:heapq。堆推(自己。data,elem)else:TopK _ small=self。data[0]if elem TopK _ small:heapq。heapreplace(self。data,elem)def TopK(self):return[x for x in reversed([heapq。希波按下打印按钮. TopK()) # [986241,985101,975889] print(sorted(list_rand,reverse=True)[0:3]) # [986241,985101,975889]
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。