日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈优先队列

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈优先队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

淺談優先隊列

一道面試題

如果你被問到:
“編寫一個程序,從 10 億個元素的整數數組中找出前10個最大的數。”
你會怎么回答?

我想,最最簡單的回答就是蠻力法:先對這10億個數排序(比如用時間復雜度為 O(nlogn)O(nlog?n) 的快速排序),然后選出前10個最大的。

請問有更好的方法嗎?

優先隊列是什么

普通的隊列是一種先進先出的數據結構:從隊尾追加元素,從隊首刪除元素。

在優先隊列中,元素被賦予優先級。出隊時,具有最高優先級的元素被刪除,也就是說,優先隊列具有最高優先級先出(largest-in,first-out)的行為特征。

優先隊列支持兩種基本操作

  • 向優先隊列插入一個新元素
  • 刪除(或得到)優先隊列中優先級最高的元素
  • 對于本文開始的問題,如果你知道了有“優先隊列”這么一說,則很容易想到下面的解決辦法:

  • 建立大小為 10 的容器
  • 從數組中讀取一個數到變量temp
  • 如果容器沒有滿,則把temp加入容器;如果容器已滿,則找出容器中最小的數(利用優先隊列的性質)和temp比較:若temp較大,則最小元素出隊,temp入隊;若temp較小,轉到 4
  • 重復2~3,直至讀完整個數組,此時容器中的 10 個數就是所求。
  • 此外,上述方案可以并行方式運行,最后合并結果。

    除了上面的例子,優先隊列還有一些重要的應用場景。

    比如作業(或者說任務)調度,當一個作業完成后,需要在所有等待調度的作業中選擇一個優先級最高的作業來執行,并且也可以添加一個或多個新的作業到優先隊列中。

    再比如排序,通過插入一系列元素,然后一個個地刪除其中最小的元素,就可以實現從小到大的排序。一種名為“堆排序”的重要排序算法正是利用了基于“堆”實現的優先隊列。

    優先隊列的實現

    用無序數組實現

    對于入隊操作,直接把元素追加到數組尾部。時間復雜度為 O(1)。

    對于出隊操作,需要遍歷數組,找出優先級最高的元素,并刪除之,空缺的位置由后面的元素依次補上。因此,出隊的時間復雜度為 O(n)。

    用有序數組實現

    對于入隊操作,由于要求數組有序,所以在插入元素的時候需要遍歷數組以找到適合的位置,然后在該位置插入,同時此位置后面的元素要依次向后移動,時間復雜度為 O(n)。

    對于出隊,由于序列是有序的,所以時間復雜度為 O(1)。

    用鏈表實現

    用鏈表實現和數組類似,也可分為無序和有序兩種,不同的是采用鏈式存儲結構,省去了移動元素的麻煩。

    用堆實現

    上面三種實現思路其實都不怎么好,不是入隊的時間復雜度為 O(n),就是出隊的時間復雜度為 O(n). 有沒有更好的實現呢?有一種數據結構叫“堆”,基于堆實現的優先隊列,出隊和入隊的時間復雜度都為 O(logN).

    堆到底是什么,都有哪些性質,具體怎么實現……這一系列的問題,咱們下回聊。

    【未完待續】

    參考資料
    https://allenwind.github.io/2017/09/12/%E4%BC%98%E5%85%88%E9%98%9F%E5%88%97%E7%9A%84%E4%BA%94%E7%A7%8D%E5%AE%9E%E7%8E%B0/

    與50位技術專家面對面20年技術見證,附贈技術全景圖

    總結

    以上是生活随笔為你收集整理的浅谈优先队列的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。