堆又稱為優先隊列,其通常包括至少兩種操作:入隊操作和出隊操作。
普通隊列與優先隊列
普通隊列:先進先出,后進后出
優先隊列:出隊序列和入對序列無關,只與優先級有關
為什么選擇優先隊列?
動態的選擇優先級最高的任務執行
在N個元素中選出前M個元素
排序的時間復雜度為O(NlogN)
使用優先隊列時間復雜度為O(NlogM)
當N的較大,M較小的時候,使用優先隊列比較快
優先隊列的實現
類型 | 入隊 | 出隊 |
---|---|---|
普通數組 | O(1) | O(n) |
順序數組 | O(n) | O(1) |
堆 | O(lgn) | O(lgn) |
采用普通數組,依次入隊,選擇出隊
順序數組,排列入隊
堆,平衡入隊與出隊的時間,使其保持在O(lgn)
采用普通數組,最差的情況為O(n^2)
完全二叉樹
葉節點只能出現在最下層和次下層,并且最下面一層的結點都集中在該層最左邊的若干位置的二叉樹。
二叉堆
二叉堆是一種特殊的堆,二叉堆是完全二元樹(二叉樹)或者是近似完全二元樹(二叉樹)。二叉堆有兩種:最大堆和最小堆。最大堆:父結點的鍵值總是大于或等于任何一個子節點的鍵值;最小堆:父結點的鍵值總是小于或等于任何一個子節點的鍵值。
二叉堆滿足二個特性:
1.父結點的鍵值總是大于或等于(小于或等于)任何一個子節點的鍵值。
2.每個結點的左子樹和右子樹都是一個二叉堆(都是最大堆或最小堆)。