數據結構之優先隊列

1、什麼是優先隊列

       優先隊列顧名思義,就是優先權最大的排在隊列的頭部,而優先權的判斷是根據對象的compare方法比較獲取的,保證根節點的優先級一定比子節點的優先級大。所以放入到優先隊列的元素要麼實現了Comparable接口,要麼在創造這個優先隊列時,指定一個比較器。

2、java之PriorityQueue分析

     1、存儲:java底層採用數據數組Object[] queue來存儲隊裏的數據 默認初始大小爲11,最大長度爲 Integer.MAX_VALUE - 8

                     優先隊列代表平衡二叉堆,數組中元素的關係:the two  children of queue[n] are queue[2*n+1] and queue[2*(n+1)]

         初始化優先隊列的方式有兩種:

                a.不指定比較器:比較器默認爲null 此時隊列中的元素需要實現Comparable接口,重寫compareTo方法。

                        如果不指定比較器 而且元素類型也不實現Comparable方法 會拋出

  java.lang.ClassCastException: com.hyj.priorityque.Dog cannot be cast to java.lang.Comparable

                b.指定比較器

                  

       2、添加


           

   SiftUp方法主要講述:



如果插入元素的位置k>0  則尋找k處元素的父親節點的位置 也就是(k-1)>>>1 比較父節點和插入元素的優先級,如果插入元素的優先級小於父節點的,將父節點插入k所在的位置,k=parent再從此處進行判斷 直到k不大於0 則將key值插入queue[k]中。

簡單說來 就是不斷通過比較跟父元素的優先級 確定插入元素的位置

       3、刪除元素

           

 

通過indexOf查詢




如果刪除的不是最後一個元素:從刪除點開始以最後一個元素爲參照進行siftDown

4、隊列頭部的元素

peek() poll() 都可以獲取頭部的元素 區別就是poll() 會進行刪除操作。


siftDown(int k, E x)方法,該方法的作用是k指定的位置開始,將x逐層向下與當前點的左右孩子中較小的那個交換,直到x小於或等於左右孩子中的任何一個爲止



參考文章:

http://blog.csdn.net/dy5623405/article/details/51487390

                

SiftUp方法主要講述:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章