1. 程式人生 > >優先佇列(堆)淺談

優先佇列(堆)淺談

1、概述

在分析堆之前,你可以理解一下佇列和棧,其實他們都是對任務的一種排程策略,只是各自的準則不同罷了,佇列為先進先出,棧為先進後出,而堆是每個任務分配了一個優先權,根據優先權進行任務的執行。排程程式通過堆始終能獲取優先權最高的任務進行執行。比較常見應用為作業系統。

2、模型

堆又稱為優先佇列,其通常包括至少兩種操作:insert(入隊操作)和deleteMin(出隊操作)。

3、實現方式

a.連結串列實現

簡單鏈表的實現過程為在連結串列的頭insert元素,使用O(1)時間完成,每次deleteMin元素,查找出連結串列中最小的元素,花費O(N)時間完成;另外一種方法是讓連結串列保持有序狀態,在進行任務insert的時候進行排序(花費O(N)),每次獲取連結串列的頭(花費O(1))。

b.二叉查詢樹實現

使用二叉查詢樹實現中,對於insert和deleteMin花費時間均為O(log(N)),但存在一個潛在問題,既是容易造成不平衡二叉樹,因為deleteMin始終是從左邊開始往右邊進行刪除。

c.二叉堆實現

二叉堆對於優先佇列實現比較普遍,通二叉查詢樹一樣,二叉堆具有兩個性質:結構性和堆序性。 結構性:必須是一顆完全二叉樹,樹的插入從左到右,一顆完全二叉樹的高度為小於log(N)的最大整數。 堆序性:二叉樹的父節點必須小於兩個子節點。 在二叉堆的具體實現中,通過一個數組來儲存所有的元素,具體操作包括: insert操作:在陣列的最後位置新增該元素,然後再通過二叉堆的性質上慮新插入的元素,直到找到該元素的合適位置; deleteMin操作:刪除的元素為根元素,同時把陣列最後元素賦值給根元素,根元素根據二叉堆的性質下慮,直到找到合適的位置。 buildHeap操作:對一組輸入的資料進行構造堆,通過從下到上對非葉子節點進行下慮,所花費時間為O(N)