當前位置:編程學習大全網 - 源碼下載 - 面試官再問妳優先級隊列,請把這篇文章丟給他

面試官再問妳優先級隊列,請把這篇文章丟給他

假如妳設計的事件系統中有很多的事件,每個事件都定義了不同的權重值,系統需要優先處理權重較高的事件,這裏妳就需要使用到優先級隊列,本篇我們壹起來學習實現優先級隊列的常用方式

在實現之前,首先我們需要先定義出優先級隊的API,優先級隊列是壹種抽象的數據結構,我們依然可以基於前面我們使用到的隊列API來修改;需要了解之前的隊列的實現可以查看《面試的季節到了,老哥確定不來復習下數據結構嗎》

其中的入隊列 enqueue 和出隊列 dequeue 是我們主要需要實現的方式,也是優先級隊列的核心方法

實現優先級隊列的最簡單實現可以參考《面試的季節到了,老哥確定不來復習下數據結構嗎》中棧的實現方式, enqueue 和棧的 push 方式實現方式壹致, dequeue 可以參考選擇排序的實現,循環壹遍數組,找出最大值和數組最後壹個元素交換,然後刪除它;

這裏只實現了定長的優先級隊列,如何實現自動擴容呢?也可以參考這篇文章《面試的季節到了,老哥確定不來復習下數據結構嗎》;基於無序數組實現的enqueue時間復雜度是O(1),dequeue時間復雜度是O(n)

基於有序數組實現就是在入隊的時候保證數組有序,那麽在出隊列的時候可以直接刪掉最大值;插入的過程和插入排序類似的操作

enqueue時間復雜度是O(n),dequeue時間復雜度是O(1)

基於鏈表的實現與上面的類似,有興趣的可以自己實現

在二叉堆中,每個節點都將大於等於它的子節點,也成為堆有序;其中根節點是最大的節點。

二叉堆的表示:

重點:

在壹個二叉堆中,位置k節點的父節點的位置為 k/2 ,它的兩個子節點的位置為 2k 和 2k+1 ; 基於這點,我們可以用數組來表示二叉堆,通過移動數組的下標來找到節點父節點和子節點

在元素進行插入和刪除操作的過程中,會破壞堆有序,所以我們需要做壹些操作來保證堆再次有序;主要有兩種情況,當某個節點的優先級上升,我們需要 由下向上恢復堆有序(下沈) ;當某個節點優先級下降,我們需要 由上向下恢復堆有序(上浮)

根據當前的節點k找到父節點的位置k/2,比較當前節點和父節點,如果比父節點大就交換,直到找個比當前節點大的父節點或者已上浮到了根節點

文中所有源碼已放入到了github倉庫 /silently9527/JavaCore

文中或許會存在或多或少的不足、錯誤之處,有建議或者意見也非常歡迎大家在評論交流。

最後, 寫作不易,請不要白嫖我喲 ,希望朋友們可以 點贊評論關註 三連,因為這些就是我分享的全部動力來源?

  • 上一篇:Hive門戶源代碼
  • 下一篇:css如何調用字體css如何調用字體大小
  • copyright 2024編程學習大全網