以前學習過隊列,所謂隊列就像咱們平時排的隊同樣,排成一排,先排隊的人先得到,先到先得。真實的世界不是這樣的,有的人要插隊,有的事情比較的緊急優先處理,生活中有不少這樣的例子告訴咱們並非說先到先得的,我說這樣的意思並非說咱們的社會很差,而是人們在經濟活動中天然而然產生的狀況。數組
舉一個栗子,好比你要去北京協和醫院看病,首先你的掛專家的號,但是這個專家的號你要排隊恐怕要等一年之久,固然病情也不容許這樣,不準的立刻治療,因而乎你找人託關係找到了黃牛,他有資源能夠立刻讓你掛到專家號,能夠你得出5000RMB,就這樣你經過黃牛掛到了這個專家的號。 數據結構
上面咱們花了大段文字講了排隊這件事情,其實我今天談到話題就是數據結構中的優先隊列,聽起這個名字其實和隊列有點不同。普通隊列是先到先得,先進先出,而優先隊列出隊列和入隊的順序無關,和優先級有關,可能最後一個入隊的元素會最早出隊學習
優先隊列從底層來講仍是一個隊列,和普通隊列在實現並無太多的差異,惟一差異比較大的可能就是入隊(enqueue) 和出隊(dequeue)不同,能夠直接使用之前用到的隊列接口,不同的地方就是在接口的實現上。好比出隊的元素不是入隊最先的元素,而是優先級最高的元素最早出隊cdn
對於優先隊列的底層實現,可使用不一樣的數據結構,好比使用鏈表、數組這樣的線性結構,也可使用二叉樹這樣的樹型結構blog
方案 | 入隊 | 出隊(最大元素) |
---|---|---|
普通線性結構 | O(1) | O(n) |
順序線性結構 | O(n) | O(1) |
堆 | O(logn) | O(logn) |
從上面的圖中咱們能夠看到普通的線性結構、順序線性結構總有一個的時間複雜度是O(n),順序線性結構確實維護了一個有序的數據,取出最大元素複雜度在O(1),可是爲了維持這個循序不得不遍歷全部的元素來插入一個新的元素。 若是咱們採用堆來實現優先隊列,狀況會好不少,入隊出隊複雜度都在O(logn),即使在最差的是否複雜度也是O(logn)接口
本身最近在學習數據結構,對數據結構應該怎麼學習不知道,一點點的敲代碼,碼字,寫文章,我以爲比我以前學了就忘恐怕要好一些,至少不會忘記的那麼快,還能夠整理一下思路,在學完這個課程後,能夠回過頭來複習一下,看看本身有沒有用心學習,學的怎麼樣。 一開始在寫的時候句子不免有些不通順的地方,我也在一點點的改進,爭取一節課一篇文章,把學習的過程記錄下來。 下篇文章將介紹使用堆實現的優先隊列隊列