跳到主要內容

線性結構隊列以及應用(上)_台中搬家公司


※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益



擁有後台管理系統的網站,將擁有強大的資料管理與更新功能,幫助您隨時新增網站的內容並節省網站開發的成本。



隊列Queue:什麼是隊列?


對列是一種有次序的數據集合,其特徵是新數據項的添加總發生在一端(通常稱為"尾rear"端),而現存數據項的移除總發生在另一端(通常稱為"首front"端)


當數據項加入隊列,首先出現在隊尾,隨着隊首數據項的移除,它逐漸接近隊首。新加入的數據項必須在數據集末尾等待,而等待時間最長的數據項則是隊首。這種次序安排的原則稱為:先進先出。


隊列的例子出現在我們日常生活的方方面面:水管,排隊;隊列僅有一個入口和一個出口。不允許數據項直接插入隊中,也不允許從中間移除數據項。


抽象數據類型Queue


抽象數據類型Queue是一個有次序的數據集合,數據項僅添加到"尾"端,而且僅從"首"端移除,Queue具有先進先出的操作次序。



  • 抽象數據類型Queue由如下操作定義:



    Queue():創建一個空隊列對象,返回值為Queue對象;


    enqueue(item):將數據項item添加到隊尾,無返回值;


    dequeue():從隊首移除數據項,返回值為隊首數據項,隊列被修改;


    isEmpty():測試是否空隊列,返回值為bool;


    size():返回隊列中數據項的個數。




































































    隊列操作 隊列內容 返回值
    q=Queue() [] Queue object
    q.isEmpty() [] True
    q.enqueue(4) [4]
    q.enqueue("dog") ["dog",4]
    q.enqueue(True) [True,"dog",4]
    q.size() [True,"dog",4] 3
    q.isEmpty() [True,"dog",4] False
    q.enqueue("dog") [8.4,True,"dog",4]
    q.dequeue() [8.4,True,"dog"] 4
    q.dequeue() [8.4,True] "dog"
    q.size() [8.4,True] 2


Python實現Queue


採用List來容納Queue的數據項,將List首端作為隊列尾端,List的末端作為隊列的首端,enqueue()複雜度為O(n),dequeue()複雜度為O(1)


class Queue:
def __init__(self):
self.items = []

def isEmpty(self):
return self.items == []

def enqueue(self, item):
self.items.insert(0, item)

def dequeue(self):
return self.items.pop()

def size(self):
return len(self.items)

注意:首尾倒過來的實現,複雜度也倒過來。


隊列的應用:約瑟夫問題


傳說猶太人反叛羅馬人,落到困境,約瑟夫和39人決定殉難,坐成一圈,報數1-7,報到7的人由旁邊殺死,結果略瑟夫給自己安排了個位置,最後活了下來……


模擬程序採用隊列來存放所有參加遊戲的人名,按照報數的方向從隊首排到隊尾,模擬遊戲開始,只需要將隊首的人出隊,隨機再到對尾入隊,算是一次報數完成,反覆n次后,將隊首的人移除,不再入隊,如此反覆,知道隊列中剩下一人。


def JosephQuestion(namelist,num):
simqueue = 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()

隊列的應用:打印任務


有如下場景:多人共享一台打印機,採取"先到先服務"的策略來執行打印任務,在這種設定下,一個首要問題就是:這種打印作業系統的容量有多大?在能夠接受的等待時間內,系統能夠容納多少用戶以多高頻率提交到少打印任務?


一個具體的實例配置如下:


一個實驗室,在任意的一個小時內,大約有10名學生在場,這一個小時中,每個人發起2次左右的打印,每次1-20頁。打印機的性能是:以草稿模式打印的話,每分鐘10頁,以正常模式打印的話,打印質量好,但是速度下降,每分鐘只能打印五頁。


問題:怎麼設定打印機的模式,讓大家都不會等太久的前提下,盡量提高打印質量?這是一個典型的決策支持問題,但無法通過規則直接計算,我們要用一段程序來模擬這種打印任務場景,然後對程序運行結果進行分析,以支持對打印機模式設定的決策。


如何對問題建模:


首先對問題進行抽象,確定相關的對象和過程。拋棄那些對問題實質沒有關係的學生性別,年齡,打印機型號,打印內容,智障大小等等眾多細節。


對象:打印任務,打印隊列,打印機。



打印任務的屬性:提交事件,打印頁數


打印隊列的屬性:具有"先進先出"性質的打印任務隊列


※推薦台中搬家公司優質服務,可到府估價



台中搬鋼琴,台中金庫搬運,中部廢棄物處理,南投縣搬家公司,好幫手搬家,西屯區搬家



打印機的屬性:打印速度,是否忙



過程:生成和提交打印任務



確定生成概率:實例為每小時會有10個學生提交的20個作業,這樣概率是每180秒會有1個作業生成並提交,概率為每秒1/180。


確定打印頁數:實例是1-20頁,那麼就是1-20頁之間概率相同。



過程:實施打印



當前的打印作業:正在打印的作業


打印結束倒計時:新作業開始打印時開始倒計時,返回0表示打印完畢,可以處理下一個作業。



模擬時間:



統一的時間框架:以最小單位(秒)均勻流逝的時間,設定結束時間


同步所有過程:在一個時間單位里,對生成打印任務和實施打印兩個過程各處理一次



打印任務問題:流程模擬


創建打印隊列對象


時間按照秒的單位流逝



按照概率生成打印作業,加入打印隊列


如果打印機空閑,且隊列不空,則取出隊首作業打印,記錄此作業等待時間


如果打印機忙,則按照打印速度進行1秒打印


如果當前作業打印完成,則打印機進入空閑



時間用盡,開始統計平均等待時間


作業的等待時間



生成作業時,記錄生成的時間戳


開始打印時,當前時間減去生成時間即可



作業的打印時間



生成作業時,記錄作業的頁數


開始打印時,頁數除以打印速度即可



import random

class Printer:
def __init__(self, ppm):
self.pagerate = ppm # 打印速度
self.currentTask = None # 打印任務
self.timeRemaining = 0 # 任務倒計時

def tick(self): # 打印1秒
if self.currentTask != None:
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, newtask): # 打印新作業
self.currentTask = newtask
self.timeRemaining = newtask.getPages() * 60 / self.pagerate


class Task:
def __init__(self, time):
self.timestamp = 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)
if num == 180:
return True
else:
return False

def simulation(numSeconds, pagesPerMinute): # 模擬
labprinter = Printer(pagesPerMinute)
printQueue = Queue()
waittingtimes = []

for currentSecond in range(numSeconds):
if newPrintTask():
task = Task(currentSecond)
printQueue.enqueue(task)

if not labprinter.busy() and not printQueue.isEmpty():
nexttask = printQueue.dequeue()
waittingtimes.append(nexttask.waitTime(currentSecond))
labprinter.startNext(nexttask)

labprinter.tick()

averageWait = sum(waittingtimes) / len(waittingtimes)
print("Average Wait %6.2f secs %3d tasks remaining" %(averageWait,printQueue.size()))
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

※台中搬家公司教你幾個打包小技巧,輕鬆整理裝箱!



還在煩惱搬家費用要多少哪?台中大展搬家線上試算搬家費用,從此不再擔心「物品怎麼計費」、「多少車才能裝完」




Orignal From: 線性結構隊列以及應用(上)_台中搬家公司

留言

這個網誌中的熱門文章

TOYOTA將與FirstElement合作建立加氣站

據AUTONET報導,TOYOTA將與能源公司FirstElement攜手合作加氫站網絡的架設,預計2015-2016年能夠建成20多處的加氣站,並能在2024年實現擴建至100座的計畫。 TOYOTA於2013年底東京車展發表準量產版的FCV Concept,此後又藉由年初的2014 CES消費電子展預告2015年將率先投入北美市場販售,因此對於加氫站等後勤網絡的建設排上日程。 其實在過去的20年來,TOYOTA就已持續針對氫燃料電池進行研發,自2002年以來便投入一系列的測試車輛於北美進行實測,隨著技術的突破,使得氫燃料電池技術成本大幅下修,終於達到原廠量產的預期。 儘管FCV(氫燃料電池車)最終量產版本的相關數據原廠尚未公開,但參考FCV Concept所呈現的數據就相當令人滿意。 動力來源為分別藏在車身底下的氫燃料儲存槽及電池,具備等同於136hp馬力的100kW輸出功率,需花費10秒才能完成100km/h的加速衝刺,滿電的情況下續航力約可達到482km,而且僅需3-5分鐘的時間便能將儲存槽加滿,省去了傳統電池充電耗時的問題。 重點是氫燃料電池是以氫或含氫物質結合氧所形成的一種燃料電池,在化學反應之後僅會產生電流及水且完全沒有污染。 動力來源為分別藏在車身底下的氫燃料儲存槽及電池(圖片來源:AUTONET) 本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理 【其他文章推薦】 ※ 新北清潔 公司,居家、辦公、裝潢細清專業服務 ※別再煩惱 如何寫文案 ,掌握八大原則! ※ 網頁設計 一頭霧水該從何著手呢? 台北網頁設計 公司幫您輕鬆架站! ※超省錢 租車 方案 ※教你寫出一流的 銷售文案 ? Orignal From: TOYOTA將與FirstElement合作建立加氣站

有了四步解題法模板,再也不害怕動態規劃!(看不懂算我輸)

導言 動態規劃問題一直是算法面試當中的重點和難點,並且動態規劃這種通過空間換取時間的算法思想在實際的工作中也會被頻繁用到,這篇文章的目的主要是解釋清楚 什麼是動態規劃 ,還有就是面對一道動態規劃問題,一般的 思考步驟 以及其中的注意事項等等,最後通過幾道題目將理論和實踐結合。 什麼是動態規劃 如果你還沒有聽說過動態規劃,或者僅僅只有耳聞,或許你可以看看 Quora 上面的這個 回答 。 How to explain dynamic 用一句話解釋動態規劃就是 " 記住你之前做過的事 ",如果更準確些,其實是 " 記住你之前得到的答案 "。 我舉個大家工作中經常遇到的例子。 在軟件開發中,大家經常會遇到一些系統配置的問題,配置不對,系統就會報錯,這個時候一般都會去 Google 或者是查閱相關的文檔,花了一定的時間將配置修改好。 過了一段時間,去到另一個系統,遇到類似的問題,這個時候已經記不清之前修改過的配置文件長什麼樣,這個時候有兩種方案,一種方案還是去 Google 或者查閱文檔,另一種方案是借鑒之前修改過的配置,第一種做法其實是萬金油,因為你遇到的任何問題其實都可以去 Google,去查閱相關文件找答案,但是這會花費一定的時間,相比之下,第二種方案肯定會更加地節約時間,但是這個方案是有條件的,條件如下: 之前的問題和當前的問題有着關聯性,換句話說,之前問題得到的答案可以幫助解決當前問題 需要記錄之前問題的答案 當然在這個例子中,可以看到的是,上面這兩個條件均滿足,大可去到之前配置過的文件中,將配置拷貝過來,然後做些細微的調整即可解決當前問題,節約了大量的時間。 不知道你是否從這些描述中發現,對於一個動態規劃問題,我們只需要從兩個方面考慮,那就是 找出問題之間的聯繫 ,以及 記錄答案 ,這裏的難點其實是找出問題之間的聯繫,記錄答案只是順帶的事情,利用一些簡單的數據結構就可以做到。 概念 上面的解釋如果大家可以理解的話,接    動態規劃 算法是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。它的幾個重要概念如下所述。    階段: 對於一個完整的問題過程,適當的切分為若干個相互聯繫的子問題,每次在求解一個子問題...

數據資產的玄學、顯學

數據就是資產,這個道理在商業領域並不難懂。 比如國外有聚焦金融數據的彭博,國內也有萬德,早期靠着人工錄入、整理數據的方式,聚集了龐大的數據庫,成為投資公司的必備;而聚焦學術文獻等知識數據的知網,不僅舒舒服服賺差價,還能涉嫌壟斷被處罰。 但數據資產這個理念,在全社會得到認可,也非一蹴而就,而是一波一波的普及、深化。 2011年,麥肯錫發布報告,認為"大數據Big Data已成為當今競爭、創新、生產效率提升的關鍵基礎"。一時間,大數據,成為業內熱點。數據,大家都懂;大,有什麼區別? 聚焦大數據的創業公司紛紛成立,時任美國總統的奧巴馬也在2012年3月宣布了"大數據研究與發展先導計劃",雖然投資額僅2億美元,但有評論認為這和上世紀90年代的信息公路計劃相媲美。 而不管大的是什麼,至少一個確定的趨勢是,數據資產,越來越值錢。 這股科技新風也來到中國。本着"懂不懂先不說,有新趨勢就先干"的大A,也漸漸熱鬧起來。比如擁有消費者購買記錄的百貨公司,雖然還處於電商取代線下的衰退趨勢中,但投資者還是興奮地給了"估值重構"的機會,2013年7月份,也曾有過股價快速漲一倍的戰績。 而最"得勢"的當屬銀之傑,公司通過收購億美軟通,為企業向用戶發送短信,每年發送量超過100億條。每一條短信,在投資人眼裡,都是金燦燦的"數據資產"。再疊加科技牛市buff,銀之傑受到投資者的狂熱追捧。從2012年底起,兩年半漲幅近100倍。一個字,絕。兩個字,瘋狂。 2015年4月,我國首家大數據交易所——貴陽大數據交易所成立,對數據資產的探索,又邁出了關鍵一步。成立當天就完成了第一筆數據交易,交易所管理層也雄心勃勃,提出在3~5年內將日交易額推到100億元的規模。 蜂擁而至的故事,結局似乎都差不多。2016年,Gartner在報告中警告:許多公司正打算削減大數據項目投入。 百貨行業沒有避開電商的衝擊,業績也沒有被數據資產改善;而短信等數據,也讓投資人清醒,有的數據是資產,有的只是01代碼,或者只是投資人情緒的載體。而在大數據領域創業的公司,也有一些融了FGH輪之後,不得不賣服務器來改善現金流。而貴陽大數據中心也在2022年8月,才實現了數據交易規模...