前言:最近有不少粉絲關注本公眾號。並且我已經成功開通了流量主同時會賺一點點廣告費,我打算每個月把這部分錢拿出來給大家買點書刊,算是給大家一點福利吧。大家想買什麼書掃描下方的加他拉你加群。最後,非常感謝大家的關注。
在使用java的優先隊列PriorityQueue的時候,會看到這樣的用法。
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2){ return o1.compareTo(o2); }});1)k>0,隊列長度大於0
2)parent = k - 1 >>> 1; 即(k-1)/2,表示最後一個非葉子節點的位置
3)e為父節點,x是入隊元素,x可以看做放在最後一個位置。如果compare(x, e) < 0,則執行元素往上走的方法。
註:在siftUp中,如果是最小堆,那麼應該是較小的元素往上走,如果是最大堆,則應該是較大的元素往上走。由於源碼中新入隊元素x是在第1個參數的位置,因此最大/最小優先隊列主要根據第1個參數的大小關係來判斷。
int compare(Integer x, Integer e){ return x > e ? -1 : 1;}int compare(Integer x, Integer e){ return x < e ? -1 : 1; }結論:
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2){ return o1 < o2 ? -1 : 1; }});我不在乎我的作品文章是被現在的人讀還是由子孫後代來讀。既然上帝花了六千年來等一位觀察者,我可以花上一個世紀來等待讀者。