最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python的數(shù)據(jù)結(jié)構(gòu)與算法的隊(duì)列詳解(3)

 更新時間:2022年03月09日 16:51:16   作者:姜學(xué)遷  
這篇文章主要為大家詳細(xì)介紹了Python的隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

模擬打印機(jī)任務(wù)隊(duì)列過程

計(jì)算機(jī)科學(xué)中也有眾多的隊(duì)列例子。比如計(jì)算機(jī)實(shí)驗(yàn)室有10臺計(jì)算機(jī),它們都與同一臺打印機(jī)相連。當(dāng)學(xué)生需要打印的時候,他們的打印任務(wù)會進(jìn)入一個隊(duì)列。該隊(duì)列中的第一個任務(wù)就是即將執(zhí)行的打印任務(wù)。如果一個任務(wù)排在隊(duì)列的最后面,那么它必須等到所有前面的任務(wù)都執(zhí)行完畢后才能執(zhí)行。?

學(xué)生向共享打印機(jī)發(fā)送打印請求,這些打印任務(wù)被存在一個隊(duì)列中,并且按照先到先得的順序執(zhí)行。這樣的設(shè)定可能導(dǎo)致很多問題。其中最重要的是,打印機(jī)能否處理一定量的工作。如果不能,學(xué)生可能會由于等待過長時間而錯過要上的課。?

考慮計(jì)算機(jī)實(shí)驗(yàn)室里的這樣一個場景:在任何給定的一小時內(nèi),實(shí)驗(yàn)室里都有10個學(xué)生。他們在這 一小時內(nèi)最多打印2次,并且打印的頁數(shù)從1到20頁不等。實(shí)驗(yàn)室的打印機(jī)比較老舊,每分鐘只能以低質(zhì)量打印10頁。也可以將打印質(zhì)量調(diào)高,但是這樣做會導(dǎo)致打印機(jī)每分鐘只能打印5頁。降低打印速度可能導(dǎo)致學(xué)生等待過長時間。那么,應(yīng)該如何設(shè)置打印速度呢??

可以通過構(gòu)建一個模型來解決該問題。我們需要為學(xué)生、打印任務(wù)打印機(jī)構(gòu)建對象。當(dāng)學(xué)生提交打印任務(wù)時,我們需要將它們加入打印機(jī)的任務(wù)隊(duì)列中。當(dāng)打印機(jī)執(zhí)行完一個任務(wù)后,它會檢查該隊(duì)列,看看其中是否還有需要處理的任務(wù)。我們感興趣的是學(xué)生平均需要等待多久才能拿到打印好的文章。這個時間等于打印任務(wù)在隊(duì)列中的平均等待時間。?

在模擬時,需要應(yīng)用一些概率學(xué)知識。舉例來說,學(xué)生打印的文章可能有1~20頁。如果各頁數(shù)出現(xiàn)的概率相等,那么打印任務(wù)的實(shí)際時長可以通過模擬1~20的一個文章頁數(shù)隨機(jī)數(shù)來計(jì)算得出。?

如果實(shí)驗(yàn)室里有10個學(xué)生,并且在一小時內(nèi)每個人都打印次,那么每小時平均就有20個打印任務(wù)。 在任意一秒,創(chuàng)建一個打印請求的概率是多少? 回答這個問題需要考慮任務(wù)與時間的比值。每小時20個任務(wù)相當(dāng)于每180秒1個任務(wù)。?

在這里插入圖片描述

可以通過1~180的一個隨機(jī)數(shù)來模擬每秒內(nèi)產(chǎn)生打印請求的概率(1/180的概率)。如果隨機(jī)數(shù)正好是180,那么就認(rèn)為有 一個打印請求被創(chuàng)建。注意,可能會出現(xiàn)多個請求接連被創(chuàng)建的情況,也可能很長一段時間內(nèi)都沒有請求。這就是模擬的本質(zhì)。我們希望在常用參數(shù)已知的情況下盡可能準(zhǔn)確地模擬。?

主要模擬步驟:

1.創(chuàng)建一個打印任務(wù)隊(duì)列。每一個任務(wù)到來時都會有一個時間戳。一開始,隊(duì)列是空的。

2.針對每一秒(currentSecond),執(zhí)行以下操作。

  • 是否有新創(chuàng)建的打印任務(wù)?如果是,以 currentSecond 作為其時間戳并將該任務(wù)加入到隊(duì)列中。
  • 如果打印機(jī)空閑,并且有正在等待執(zhí)行的任務(wù),執(zhí)行以下操作:
    • 隊(duì)列中取出第一個任務(wù)并提交給打印機(jī);
    • 用 currentSecond 減去該任務(wù)的時間戳,以此計(jì)算其等待時間;
    • 將該任務(wù)的等待時間存入一個列表,用來作為計(jì)算平均等待時間的數(shù)據(jù);
    • 根據(jù)該任務(wù)的頁數(shù),計(jì)算執(zhí)行時間。
  • 打印機(jī)進(jìn)行一秒的打印,同時從該任務(wù)的執(zhí)行時間中減去一秒。
  • 如果打印任務(wù)執(zhí)行完畢,即任務(wù)的執(zhí)行時間減為0,則說明打印機(jī)回到空閑狀態(tài)。

3.當(dāng)模擬完成之后,根據(jù)等待時間列表中的值計(jì)算平均等待時間。

?構(gòu)建隊(duì)列程序

class Queue:
    def __init__(self):
        self.items = []            # 構(gòu)建空隊(duì)列
    def isEmpty(self):
        return self.items ==[]     # 判斷是否為空
    def enqueue(self,item):
        self.items.insert(0, item) # 在隊(duì)列尾部(列表左端)插入元素
    def dequeue(self):
        return self.items.pop()    # 在隊(duì)列頭部(列表右端)移出元素
    def size(self):
        return len(self.items)     # 隊(duì)列(列表)長度

模擬打印程序

import random
# 模擬打印機(jī)
class Printer:
    # 打印機(jī)初始化
    def __init__(self, ppm):
        self.pagerate = ppm      # 打印速度 頁/分鐘
        self.currentTask = None  # 現(xiàn)有任務(wù)
        self.timeRemain = 0      # 該任務(wù)所需時間
    # 打印任務(wù)倒計(jì)時 0代表打印完成
    def tick(self):
        # 如果打印機(jī)正在執(zhí)行任務(wù)
        if self.currentTask != None:
            # 該任務(wù)執(zhí)行時間 = 執(zhí)行時間 - 1(執(zhí)行時間倒計(jì)時)
            self.timeRemaining = self.timeRemaining - 1   
            if self.timeRemaining <= 0:     # 該任務(wù)執(zhí)行時間 <= 0
                self.currentTask = None     # 該任務(wù)執(zhí)行完畢
    # 判斷打印機(jī)是否空閑
    def busy(self):
        if self.currentTask != None:
            return True
        else:
            return False
    # 打印機(jī)接受新任務(wù)
    def startNext(self, newtask):
        self.currentTask = newtask
        # 新打印任務(wù)需要時間 = 新任務(wù)頁數(shù) * (60 / 每分鐘打印多少頁的速度)
        # (60 / 每分鐘打印多少頁的速度) = 每打印一頁所需要的秒數(shù)
        self.timeRemaining = newtask.getPages() * (60 / self.pagerate)

# 模擬單個任務(wù)的屬性
class Task:
    # 任務(wù)初始化
    def __init__(self, time):
        self.timestamp = time                # 創(chuàng)建任務(wù)的時間點(diǎn)
        self.pages = random.randrange(1, 21) # 任務(wù)頁數(shù) 在 1~20 間隨機(jī)生成
    def getStamp(self):
        return self.timestamp  # 獲取任務(wù)創(chuàng)建的時間點(diǎn)
    def getPages(self):
        return self.pages      # 獲取任務(wù)的頁數(shù)
    def waitTime(self, currenttime):
        # 任務(wù)的等待時間 = 當(dāng)前時間 - 任務(wù)創(chuàng)建的時間點(diǎn)
        return currenttime - self.timestamp   

# 模擬學(xué)生創(chuàng)建的新打印請求
def newPrintTask():
    # 打印請求是一個隨機(jī)事件
    # 通過1~180之間的一個隨機(jī)數(shù)來模擬每秒內(nèi)產(chǎn)生打印請求的概率
    # 如果隨機(jī)數(shù)正好是180,那么就認(rèn)為有一個打印請求被創(chuàng)建。
    num = random.randrange(1, 181)
    if num == 180:
        return True
    else:
        return False

# 模擬打印過程
def simulation(numSeconds, pagesPerMinute):
    labprinter = Printer(pagesPerMinute)
    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("平均等待 %6.2f 秒,還有 %3d 個任務(wù)等待處理"
          % (averageWait, printQueue.size()))

模擬打印過程(有注釋)

def simulation(numSeconds, pagesPerMinute):
    # numSeconds-時間段
    # pagesPerMinute-打印速度,頁/分鐘
    labprinter = Printer(pagesPerMinute)  # 創(chuàng)建打印機(jī)
    printQueue = Queue()                  # 創(chuàng)建打印機(jī)任務(wù)隊(duì)列
    waitingtimes = []                     # 創(chuàng)建等待時間數(shù)據(jù)樣本列表
    for currentSecond in range(numSeconds):  # 一次循環(huán)代表一秒
        if newPrintTask():                   # 如果 有打印請求創(chuàng)建
            task = Task(currentSecond)       # 創(chuàng)建打印任務(wù)并記錄當(dāng)前時間點(diǎn)
            printQueue.enqueue(task)         # 打印任務(wù)進(jìn)入打印機(jī)任務(wù)隊(duì)列
        # 如果 打印機(jī)空閑 并且 打印機(jī)任務(wù)隊(duì)列有任務(wù)
        if(not labprinter.busy())and(not printQueue.isEmpty()):
            nexttask = printQueue.dequeue()  # 從隊(duì)列取出新任務(wù)
            # 根據(jù)當(dāng)前時間點(diǎn)計(jì)算新任務(wù)在任務(wù)隊(duì)列里的等待時間 并將等待時間記錄進(jìn)樣本列表
            waitingtimes.append(nexttask.waitTime(currentSecond))
            labprinter.startNext(nexttask)   # 開始執(zhí)行新任務(wù) 打印機(jī)進(jìn)入忙碌狀態(tài)
        labprinter.tick()  # 每循環(huán)一次 當(dāng)前打印任務(wù)執(zhí)行倒計(jì)時減少一秒
    averageWait = sum(waitingtimes)/len(waitingtimes)
    print("平均等待 %6.2f 秒,還有 %3d 個任務(wù)等待處理" % (averageWait, printQueue.size()))

需要注意的是,時間戳是我們根據(jù)循環(huán)模擬出來的,我們給定了 numSeconds 時間段后,每循環(huán)一次相當(dāng)于時間過了一秒。

雖然每次模擬的結(jié)果不一定相同。但對此我們不需要在意。這是由于隨機(jī)數(shù)的本質(zhì)導(dǎo)致的。我們感興趣的是當(dāng)參數(shù)改變時結(jié)果出現(xiàn)的趨勢。?

下面是一些結(jié)果:

在這里插入圖片描述
在這里插入圖片描述

我們根據(jù)模擬得到了打印機(jī)在兩種速度下,一小時內(nèi)的任務(wù)執(zhí)行情況的參考數(shù)據(jù)??梢院苊黠@的看到,當(dāng)打印質(zhì)量提升后,學(xué)生平均等待時間相比低質(zhì)量情況下顯著增加,并且任務(wù)處理未完成的次數(shù)也出現(xiàn)了增加,所以設(shè)置打印機(jī)為低質(zhì)量模式是最合適的。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!   

相關(guān)文章

  • python學(xué)習(xí)之基于Python的人臉識別技術(shù)學(xué)習(xí)

    python學(xué)習(xí)之基于Python的人臉識別技術(shù)學(xué)習(xí)

    面部識別技術(shù)的應(yīng)用越來越廣泛,它廣泛應(yīng)用于安全系統(tǒng)、人機(jī)交互、社交媒體、醫(yī)療保健等領(lǐng)域。本文介紹了基于Python的人臉識別技術(shù),感興趣的小伙伴可以參考閱讀
    2023-03-03
  • 基礎(chǔ)語音識別-食物語音識別baseline(CNN)

    基礎(chǔ)語音識別-食物語音識別baseline(CNN)

    這篇文章主要介紹了一個基礎(chǔ)語音識別題目-食物語音識別baseline(CNN),代碼詳細(xì)嗎,對于想要學(xué)習(xí)語音識別的朋友可以參考下
    2021-04-04
  • Pytorch學(xué)習(xí)筆記DCGAN極簡入門教程

    Pytorch學(xué)習(xí)筆記DCGAN極簡入門教程

    網(wǎng)上GAN的教程太多了,這邊也談一下自己的理解,本文給大家介紹一下GAN的兩部分組成,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • Python實(shí)現(xiàn)采集網(wǎng)站ip代理并檢測是否可用

    Python實(shí)現(xiàn)采集網(wǎng)站ip代理并檢測是否可用

    這篇文章主要介紹了如何利用Python爬蟲實(shí)現(xiàn)采集網(wǎng)站ip代理,并檢測IP代理是否可用。文中的示例代碼講解詳細(xì),感興趣的可以試一試
    2022-01-01
  • PyCharm中如何切換Python版本

    PyCharm中如何切換Python版本

    這篇文章主要介紹了PyCharm中如何切換Python版本問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python中sys模塊常用方法與變量實(shí)例探究

    Python中sys模塊常用方法與變量實(shí)例探究

    sys?模塊是 Python 標(biāo)準(zhǔn)庫中的一個核心模塊,提供了與解釋器進(jìn)行交互的功能,了解?sys?模塊的方法和變量對于更有效地管理和調(diào)試 Python 程序至關(guān)重要,本文將深入探討?sys?模塊的常用方法和變量,通過詳細(xì)的示例代碼,幫助大家更全面地了解并靈活運(yùn)用這一關(guān)鍵模塊
    2024-01-01
  • Python創(chuàng)建文件夾與文件的快捷方法

    Python創(chuàng)建文件夾與文件的快捷方法

    這篇文章主要給大家介紹了關(guān)于Python創(chuàng)建文件夾與文件的快捷方法以及批量創(chuàng)建文件夾的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 在DigitalOcean的服務(wù)器上部署flaskblog應(yīng)用

    在DigitalOcean的服務(wù)器上部署flaskblog應(yīng)用

    這篇文章主要介紹了在DigitalOcean的服務(wù)器上部署flaskblog的方法,flaskblog是用Python的Flask開發(fā)的一個博客程序,而DigitalOcean則是大受歡迎的SSD主機(jī)提供商,需要的朋友可以參考下
    2015-12-12
  • 編程語言Python的發(fā)展史

    編程語言Python的發(fā)展史

    這篇文章主要介紹了編程語言Python的發(fā)展史,本文詳細(xì)介紹了Python語言的發(fā)展歷史,需要的朋友可以參考下
    2014-09-09
  • Python計(jì)算不規(guī)則圖形面積算法實(shí)現(xiàn)解析

    Python計(jì)算不規(guī)則圖形面積算法實(shí)現(xiàn)解析

    這篇文章主要介紹了Python計(jì)算不規(guī)則圖形面積算法實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-11-11

最新評論

泰和县| 淄博市| 临洮县| 东乡族自治县| 墨竹工卡县| 土默特左旗| 章丘市| 乐昌市| 安达市| 遂昌县| 确山县| 安图县| 虹口区| 泰兴市| 黄平县| 遵义县| 衡水市| 林口县| 青铜峡市| 伊宁县| 崇左市| 西乌珠穆沁旗| 德兴市| 临高县| 鹿泉市| 临安市| 福州市| 屯门区| 临潭县| 常熟市| 读书| 岳池县| 东丽区| 洪洞县| 墨江| 吴桥县| 东海县| 邛崃市| 阿荣旗| 虎林市| 石狮市|