python数据结构之堆

堆的定义:
    堆是一种特殊的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构指的是二叉树。堆的特点是根节点的值最大(或者最小),而且根节点的两个孩子也能与孩子节点组成子树,亦然称之为堆。
堆分为两种,大根堆和小根堆是一颗每一个节点的键值都不小于(大于)其孩子节点的键值的树。无论是大根堆还是小根堆(前提是二叉堆)都可以看成是一颗完全二叉树。下面以图的形式直观感受一下:
这里写图片描述

>>> import heapq    #heap和random是python的基础包
>>> import random
>>> data=list(range(10))    #注意range对象并不是一个列表,想要data是一个列表需要把它转为list类型
>>> data
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> random.choice(data)    #从列表中随机选择一个数显示出来,此时并不会改变原来列表的元素
3
>>> random.shuffle(data)    #random基础库中的shuffle能打乱列表元素的顺序,python官方文档说会返回一个打乱的list,#实际上只是对原来的列表进行了原地修改
>>> data
[1, 4, 8, 0, 3, 2, 9, 7, 6, 5]
>>> heap=[]    #新建一个空堆
>>> for n in data:    #用for循环把列表中的元素放在空堆中,堆中元素的顺序并不是列表的顺序,这里好像有被打乱了
 heapq.heappush(heap,n)
>>> heap
[0, 1, 2, 4, 3, 8, 9, 7, 6, 5]
>>> heapq.heappush(heap,0.5)    #把0.5插入到堆中,自动重建堆
>>> heap
[0, 0.5, 2, 4, 1, 8, 9, 7, 6, 5, 3]
>>> heapq.heappush(heap,5.1)    #堆中插入元素的顺序好像并不是有规律
>>> heap
[0, 0.5, 2, 4, 1, 5.1, 9, 7, 6, 5, 3, 8]
>>> heapq.heappush(heap,5.2)
>>> heap
[0, 0.5, 2, 4, 1, 5.1, 9, 7, 6, 5, 3, 8, 5.2]
>>> heapq.heappop(heap)    
0
>>> heapq.heappop(heap)
0.5
>>> heapq.heappop(heap)    #弹出堆中的元素,返回的值也不是有顺序的
1
>>> myheap=[1,2,3,5,7,8,9,4,10,333]
>>> heapq.heapify(myheap)    # 以线性时间把一个列表转化为堆 (之前用for循环建堆)
>>> myheap
[1, 2, 3, 4, 7, 8, 9, 5, 10, 333]
>>> item = myheap[0]    #查看堆中最小的值,不弹出
>>> item
2
>>> heapq.heapreplace(myheap,6)    #用一个新的元素替代掉原堆中最小的元素
1
>>> myheap
[2, 4, 3, 5, 7, 8, 9, 6, 10, 333]
>>> heapq.nlargest(3, myheap)    #返回堆中前3个最大的元素
[333, 10, 9]
>>> myheap
[2, 4, 3, 5, 7, 8, 9, 6, 10, 333]    
>>> heapq.nsmallest(3, myheap)     #返回堆中前3个最小的元素,这并不会改变原来堆中的元素
[2, 3, 4]
>>> myheap
[2, 4, 3, 5, 7, 8, 9, 6, 10, 333]

猜你喜欢

转载自blog.csdn.net/eacxzm/article/details/79996202