初学队列Queue实例——打印问题(Python数据结构和算法)
2020-02-03 07:20
831 查看
来自python数据结构和算法的mooc(北大)
Step1. 用python实现队列
class Queue(self): def __init__ (self): self.items = [] def enqueue(self,item): self.items.insert(0,item) def dequeue(self): self.item.pop() def size(self): return len(self.items) def isEmpty(self): return self.items == []
热身运动——约瑟夫问题(热土豆问题)
一群人围成一圈,每逢有人读到7时,那人就要被杀死。(最后只有约瑟夫活下来…)
来,请编程,以得到要被杀人的名单。
from 有队列的文件 import Queue def Hotpotato(namelist,num): simqueque = Queue() for name in namelist: simqueue.enqueue(name) while simqueue.size() > 1: for i in range(num): simqueue.enqueue(simqueue.dequeue()) #一次循环# simqueue.dequeue() return simqueue.dequeue() print((Hotpotato(['键盘侠','杠精','人贩子','黄牛',\ '军火商','米国优益','辣鸡弹窗制造者'],7))) #以上纯属娱乐不针对任何人
大头戏终于来辣
Step 2. 打印问题
实际配置:
一个实验室,在任意一小时之内,大约有10名学生在场,在这一小时中,每人会发起2次左右的打印,每次1~20页。
打印机性能:
草稿mode:10 pages/min
normal mode:5 pages/min(印得更好)
Question:
怎样在有限条件下,同学们都能顺利打印,并尽可能获得更好的打印效果
选择什么模式更好嘞?
下面请开始你的模(biao)拟(ni)~
以下为本菜鸟第一次大型血肉横飞现场(大神请右转)
from 有队列的文件 import Queue import random class Homework: def release(): homework = random.randint(1,180) if homework == 180: gerhomework = Queue() for i in range(1,random.randint(1,20)) gethomework.enqueue(i) class Printer: def __init__ (self,v): gethomework = Homework() def driftmode(): yep = totaltime if gethomework > 0: totaltime += 1 gethomework.dequeue() else: worktime = totaltime - yep return worktime def normalmode(): yep = totaltime if gethomework >0: totaltime += 1 gethomework.dequeue() worktime = totaltime - yep def idle(): pass class Test(): def __init__ (): totaltime = 0 def test_drift(): while totaltime < 3600 : if not gethomework.isEmpty() and Printer.idle(): print("运行了" + Printer.driftmode()) else: emm = True else: #写不下去了QAQ
老师解法:
打印机的定义
from 有队列的文件 import Queue import random class Printer: def __init__ (self,ppm): self.pagerate =ppm #打印速度 self.currenttask = None#打印任务 self.timeRemaining = 0#任务倒计时 def tick(self):#打印一秒 if self.currenttask != None self.timeRemaining = self.timeRemaining -1 if self.timeremaining <= 0: self.currenttask = None def busy(self):#打印忙? if self.currenttask != None: return True else: return False def startNext(self):#打印新作业 self.currenttask = newtask self.timeRemaining = newtask.getPages()*60 / self.pagerate
生成作业
class Task: def __init__(self,time): self.timetamp = time#生成时间戳 self.pages = random.randrange(1,21)#打印页数 def getStamp(self): return self.timestamp def getPages(self): return self.pages def waitTime(self,currenttime): return currenttime - self.timestamp#等待时间 def newPrintTask(): num = random.randrange(1,181)#1/180概率生成作业 if num == 180: return True else: return False
开始模拟
def simulation(numSeconds,pagePerMinute): labprinter = Printer(pagePerMinute) printQueue = Queue() waitingtimes = [] for currentSecond in range(numSeconds): if newPrintTask(): task = Task(currentSecond) printQueue.enqueue(task) if (not labprinter.busy())and (not printQueue.isEmpty()): nexttask = printqueue.dequeue() waitingtimes.append(nexttask.waitTime(currentSecond)) labprinter.startNext(nexttask) labprinter.tick() #时间流逝 averageWait = sum(waitingtimes)/len(waitingtimes) print("Average Wait %6.2f secs %3d tasks remaining."%(averageWait,printQueue.size()))
以上为模拟现实的妙用~
- 点赞 1
- 收藏
- 分享
- 文章举报
相关文章推荐
- python数据结构与算法——队列
- 左程云_算法与数据结构 — 链表问题 — 01打印两个有序链表的公共部分
- [ACM训练] 算法初级 之 数据结构 之 栈stack+队列queue (基础+进阶+POJ 1338+2442+1442)
- Python 内置数据结构 —— queue(队列)、deque(双端队列)
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
- python数据结构之队列(queue)
- python算法与数据结构-队列(44)
- 用Python实现的数据结构与算法:队列
- Python数据结构与算法之图结构(Graph)实例分析
- [笔记]python数据结构之线性表:linkedlist链表,stack栈,queue队列
- 『Python CoolBook:heapq』数据结构和算法_heapq堆队列算法&容器排序
- Python数据结构与算法之完全树与最小堆实例
- Python之队列模拟算法(烫手山芋问题)
- 算法与数据结构基础 - 队列(Queue)
- 数据结构和算法设计(迷宫求解问题的栈和队列的实现)
- python数据结构与算法——小猫钓鱼(使用队列)
- Python算法与数据结构(四)------ 栈与队列
- C++编写利用数据结构中队列(Queue)打印出用户所指定长度的杨辉三角
- Python全栈(二)数据结构和算法之6.队列的实现和冒泡排序的实现
- python 下的数据结构与算法---4:线形数据结构,栈,队列,双端队列,列表