您的位置:首页 > 理论基础 > 数据结构算法

初学队列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
  • 收藏
  • 分享
  • 文章举报
微辣不香 发布了1 篇原创文章 · 获赞 1 · 访问量 189 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: