Python数据结构2-----队列和堆
一、线性结构:栈、队列、双端队列、列表
二、非线性结构:树、图、堆
【算法中看堆是非线性的,因为其相当于完全二叉树,但堆的存储元素是采用线性的顺序表数组来实现的】
三、队列:
1、队列类型:FIFO、LIFO、双端队列、循环队列
FIFO:先进先出
LIFO:后进先出(相当于栈)
双端队列:LIFO和FIFO的结合,就是可从队首和队尾添加和删除元素。
循环队列:队首和队尾相连(可以解决假溢出)
2、FIFO【先进先出】、LIFO【后进先出】
Python自带的Queue模块(import queue【python3】、import Queue【Python2】)【线程不安全,需加锁】
有三种队列类型:FIFO(queue.queue)、LIFO(queue.LifoQueue)、优先级队列(queue.PriorityQueue)【优先级队列越低越先出来】【堆】
FIFO:import queue
创建一个队列长度为10的对象:q=queue.queue(maxsize=10)
队尾插入数据x:q.put(x)
队首删除数据:q.get(),并返回该数据
返回队列的大小:q.qsize()
判断队列是否为空:q.empty(),若为空则返回True,反之则FALSE
判断是否为满:q.full与maxsize相呼应
3、Python自带的双端队列Deque模块(from collections import deque) 【线程安全,因为GIL】
(1)新建一个deque对象:q=deque('abcdefgh'),或者创建一个大小为5的队列q=deque(5)
(1)q.appendleft(x):在列表左侧插入【O(1)】
(2)q.popleft():弹出列表左侧的值【O(1)】
(3)extendleft:在左侧扩展【O(k)】
(4)q.append(x):在列表右侧插入【O(1)】
(5)q.pop():弹出列表右侧的值【O(1)】
(6)extend:在右侧扩展【O(k)】
(7)q.rotate(-n):将左端的n个元素移动到右端【O(k)】
q.rotate(n):将右端的n个元素移动到左端
q=deque('abcdef')
q.rotate(-2)
print(q)//deque(['c','d','e','f','a','b'])
q.rotate(2)
print(q)//deque(['e','f','a','b','c','d'])
(8)q.remove('c'):删除一个指定元素【O(n)】
(9)q.clear():清空链表所有元素,使其长度为0
(10)q.reverse():将队列反转
(11)q.count(x):返回q中x的数量
(12)len(q):返回q的长度
4、Python实现循环队列:
队尾出来进队首,双端队列的rotate可以实现循环队列。
下面的例子是用queue中的FIFO实现一个功能,6个人传土豆,每数到7就淘汰手中有土豆的人,直到最后只剩一个人。
#循环队列,num一定要比人数多
import queue
def hotpotato(namelist,num):
que=queue.Queue(len(namelist))
for name in namelist:
que.put(name)
while que.qsize()>1:
for item in range(num):
que.put(que.get())
que.get()
return que.get() namelist=['a','b','c','d','e','f']
print(hotpotato(namelist,7))
5、列表、queue、deque都可以用作队列,他们的比较:
list缺点:插入队尾时需要用insert(0,x),【因为队首在队尾】,别的元素要往后移,时间复杂度大】
queue的缺点:queue只能做put,put方向只能在队尾。
deque的缺点:remove(x) 和获取索引时速度慢,因为需要执行多个数据块。list相对快一点。
四、堆:【是一棵完全二叉树】
1、python自带的堆模块:import heapq【实现最小堆】
【实现最大堆:将元素取反存入堆,取出时再取反:将push(e)改为push(-e)、pop(e)改为-pop(e)。】
- heap = [] #创建了一个空堆
- heapq.heappush ( heap,item ) #往堆heap中插入一条新的值item
- heapq.heapify(listx) #以线性时间将一个列表转化成堆
- item = heapq.heappop ( heap ) # 从堆中弹出最小值
- item = heap [0] #查看堆中最小值,不弹出
- if item > heap[0]: item = heapreplace(heap, item)
- heapq.heappushpop() #顾名思义,将值插入到堆中同时弹出堆中的最小值。
- merge(heap1,heap2,heap3) #合并多个堆然后输出
- heapq.nlargest(n , heap, key=None) #从堆中找出做大的N个数,key的作用和sorted( )方法里面的key类似,用列表元素的某个属性和函数作为关键字。
- heapq.nsmallest(n, iterable, key=None) #找到堆中最小的N个数用法同上。
item = heapq.heapreplace(heap,item) #弹出并返回最小值,然后将heapreplace方法中item的值插入到堆中,堆的整体结构不会发生改变。这里需要考虑到的情况就是如果弹出的值大于item的时候我们可能就需要添加条件来满足function的要求:
Python数据结构2-----队列和堆的更多相关文章
- 刚开始学python——数据结构——“自定义队列结构“
自定义队列结构 (学习队列后,自己的码) 主要功能:用列表模拟队列结构,考虑了入队,出队,判断队列是否为空,是否已满以及改变队列大小等基本操作. 下面是封装的一个类,把代码保存在myQueue.py ...
- python数据结构之队列
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许删除的一端 ...
- python数据结构之队列(二)
书接上文,双端队列区别于单队列为:双端队列可以对队列头和尾部同时进行操作,单队列不行 #coding:utf-8 class DoubleQueue(object): def __init__(sel ...
- python数据结构之队列(一)
队列概念 队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 队列是一种先进先出的(First In First Out)的线性表,简称FIFO.允许插入的一端为队尾,允许 ...
- Python 数据结构_队列
目录 目录 队列 队列 Queue 队列是一种先进先出(FIFO)的数据类型, 新的元素通过 入队 的方式添加进 Queue 的末尾, 出队 就是从 Queue 的头部删除元素. 用列表来做 Queu ...
- python数据结构之堆(heap)
本篇学习内容为堆的性质.python实现插入与删除操作.堆复杂度表.python内置方法生成堆. 区分堆(heap)与栈(stack):堆与二叉树有关,像一堆金字塔型泥沙:而栈像一个直立垃圾桶,一列下 ...
- PHP数据结构:栈、队列、堆、固定数组
数据结构:栈 队列: 堆: 固定尺寸的数组:
- python数据结构之栈与队列
python数据结构之栈与队列 用list实现堆栈stack 堆栈:后进先出 如何进?用append 如何出?用pop() >>> >>> stack = [3, ...
- Python数据结构之实现队列
再学习数据结构队列的时候,我不想讲太多!一切言语不如几张图来的实在! 这是第一张图,第二图是讲队列满的情况: 分析了数据结构中的队列是什么之后,我们开始写代码,代码Code如下: #coding:ut ...
随机推荐
- 使用MySQL Migration Toolkit快速导入Oracle数据
近来笔者有项目需要将原有的Oracle数据库中的数据导入到MySQL中,经过试用发现MySQL GUI Tools中的MySQL Migration Toolkit可以非常方便快捷的将Oracle数据 ...
- [bzoj1195][HNOI2006]最短母串_动态规划_状压dp
最短母串 bzoj-1195 HNOI-2006 题目大意:给一个包含n个字符串的字符集,求一个字典序最小的字符串使得字符集中所有的串都是该串的子串. 注释:$1\le n\le 12$,$1\le ...
- [bzoj1090][SCOI2003]字符串折叠_区间dp
字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...
- Linux用户管理之使用/bin/false和/usr/sbin/nologin拒绝用户登录及其功能分析(转)
/bin/nologin,/bin/false的意思是禁止某个用户登录. 比较常用的用法: #添加一个不能登录的用户 useradd -d /usr/local/apache -g apache -s ...
- luogu1168 中位数
题目大意 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], -, A[2k - 1]的中位数.即前1,3,5,--个数的中位数. 题解 ...
- SQL注入原理解析以及举例1
sql注入是指web应用程序对用户输入数据的合法性没有判断,导致攻击者可以构造不同的sql语句来实现对数据库的操作. sql注入漏洞产生满足条件: 1:用户能够控制数据的输入. 2:原本需要执行的代码 ...
- JS——BOM操作(点击按钮返回顶部案例:scrollTop的用法)
点击按钮返回顶部案例: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta chars ...
- HDU1412 {A} + {B}
2019-05-17 10:15:01 每个元素之间有一个空格隔开. 每行最后一的元素后面没有空格,区别于HDU人见人爱A - B 注意使用STL的时候要清空 . a.clear(); #inclu ...
- Hashmap 详解和迭代器问题
重点介绍HashMap.首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.在下文中会 ...
- WPF下DataGrid的简单应用
Dim dt As New DataTable() '------------------- dt.Columns.Add(New DataColumn("名称")) dt.Col ...