二叉堆 優先佇列

2021-09-11 12:02:25 字數 1860 閱讀 7227

堆:堆常見的二叉堆,這種資料結構有大根堆和小根堆。對於大根堆來說,每個父節點是大於他的兩個孩子節點的。也就是最大值在根節點。小根堆與之相反。如果堆用陣列實現的話,如果從1開始計數(因為0的位置可以在上慮或者下慮的時候做個暫存的位置),那麼乙個孩子的父節點是i/2;如果知道了父節點,而左孩子的節點位置為 ix2,右孩子節點的位置為 ix2+1。如果想加入乙個節點,只需要加入到最後乙個位置,然後向上元件大根堆。我們稱之為上慮。判斷的結束條件就是 沒有達到最上層和孩子節點是大於父親節點的,可以證明,執行一次插入平均需要2.607次,因此平均insert操作上移元素1.607層,是個常數時間。移除最大值的做法是把最後乙個值替換到第乙個位置,然後向下組建大根堆,我們稱之為下慮。結束的條件就是 節點的左孩子大於了size或者出現了父節點是大於兩個孩子就結束迴圈,過程是在孩子中先選擇出最大值並記錄位置,然後和父節點比較,再判斷需不需要交換,時間複雜度為o(logn)。對於如何建立乙個堆,如果是乙個個值的插入,那麼時間複雜度將會是o(nlogn)。而如果通過整個陣列同時建立堆,時間複雜度是o(n),方法就是先找到最後乙個非葉子節點,然後乙個個的利用上慮的方法。

優先佇列:有了大根堆後,優先佇列就可以基於堆這種資料結構進行建立了。比如優先佇列是根據數的大小進行出隊的,數越大等級越高(或者越小等級越高)。那麼我們就可以用大根堆的移除第乙個元素的方法進行乙個個的移除就可以實現優先佇列的要求出佇列的順序。時間複雜度是o(nlogn)。

public class binaryheap 

public binaryheap()

//還可以直接對乙個陣列進行堆排序

public binaryheap(int nums)

for(int i = currentsize/2;i>0;i--)

} //獲取存入了多少元素

public int getcurrentsize()

//整個陣列有多大

public int getarraysize()

//判斷是否為空

public boolean isempty()

//插入元素,上慮的過程。。。此方法如果上公升到d層,那麼用到的賦值次數為d+1次。

public void insert(int val)

int temp = ++currentsize;

for(array[0] = val; array[0] < array[temp/2];temp = temp/2)

array[temp] = array[0];

}//擴大容量

public void enlargesize()

array = nums;

} //刪除最小元素,採用下慮的方法,迴圈到已經排序或者大於了currentsize為止。此時一定要判斷有沒有左孩子。

public int deletdmin()

else

} private void sort(int index)

if(temp > array[child])

else

} array[index] = temp; //最後一定為用這個暫存的值為空位置賦值 }

//重寫輸出tostring方法

public string tostring()

return res.tostring(); }

public static void main(string args) ;

binaryheap heap = new binaryheap(nums);

heap.insert(14);

system.out.println(heap);

system.out.println(heap.getarraysize());

}}

優先佇列 二叉堆

優先佇列 二叉堆 二叉堆是一棵完全二叉樹,最大堆 最小堆 中,所有根節點的鍵值都要比對應的子樹要大 小 由於是完全二叉樹,所以儲存結構可以採用陣列。最大堆的建立 include include include include include include define inf 0x3f3f3f3f...

二叉堆(優先佇列)

0.1 本文總結於 資料結構與演算法分析,但源 均為原創 旨在理清二叉堆 優先佇列 堆的其他操作及其應用,以便讓朋友些知道為什麼要學習優先佇列 二叉堆 1.0 優先佇列定義 優先佇列是允許至少下列兩種操作的資料結構,insert 插入 它的工作時顯而易見的,以及 deletemin 刪除最小者 它的...

優先佇列和二叉堆

優先佇列 我們知道普通佇列滿足元素先進先出,也就可以看成先進的元素具有更高的優先順序,在出列時優先順序高的先出。而優先佇列中的元素的優先順序不侷限於 先進 某種定義賦予它們不同的優先順序,優先順序更高的先出列。本文涉及的優先佇列優先順序定義是 數值越小,優先順序越高。也就是說,每次取出的元素都是當前...