簡體   English   中英

最小-最大堆的 Java 實現?

[英]Java implementation for Min-Max Heap?

你知道一個流行的庫(Apache、谷歌等,集合)有一個可靠的 Java 實現最小-最大堆,這是一個允許在O(1)中查看其最小值和最大值並刪除的堆O(log n)中的一個元素?

來自番石榴: MinMaxPriorityQueue

您可以使用包含相同元素的java.util.PriorityQueue 的兩個實例來代替最大-最小堆嗎? 第一個實例將傳遞一個比較器,該比較器將最大值放在頭部,第二個實例將使用一個比較器,將最小值放在頭部。

缺點是必須在兩個結構上執行添加、刪除等操作,但它應該滿足您的要求。

Java 有很好的工具來實現最小和最大堆。 我的建議是使用優先隊列數據結構來實現這些堆。 要使用優先級隊列實現最大堆,請嘗試以下操作:

import java.util.PriorityQueue;

public class MaxHeapWithPriorityQueue {

    public static void main(String args[]) {
    // create priority queue
    PriorityQueue<Integer> prq = new PriorityQueue<>((a,b)->b-a);

    // insert values in the queue
    prq.add(6);
    prq.add(9);
    prq.add(5);
    prq.add(64);
    prq.add(6);

    //print values
    while (!prq.isEmpty()) {
        System.out.print(prq.poll()+" ");
    }
    }

}

要使用優先級隊列實現最小堆,請嘗試以下操作:

import java.util.PriorityQueue;

public class MinHeapWithPriorityQueue {

    public static void main(String args[]) {
        // create priority queue
        PriorityQueue< Integer > prq = new PriorityQueue <> ();

        // insert values in the queue
        prq.add(6);
        prq.add(9);
        prq.add(5);
        prq.add(64);
        prq.add(6);

        //print values
        while (!prq.isEmpty()) {
            System.out.print(prq.poll()+" ");
        }
    }

}

欲了解更多信息,請訪問:

好吧,您可以簡單地傳遞用於比較元素的比較器。 即使您想根據某些屬性對對象進行排序,這也會變得很有用。 請看以下示例:

  • 最小堆:

     PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> a - b);

  • 最大堆:

     PriorityQueue<Integer> pq = new PriorityQueue<>((a,b) -> b - a);

  • 對象的最小堆

    PriorityQueue<MyObject> pq = new PriorityQueue<>((obj1, obj2) -> obj1.getId() - obj2.getId());

  • 對象的最大堆

    PriorityQueue<MyObject> pq = new PriorityQueue<>((obj1, obj2) -> obj2.getId() - obj1.getId());

com.aliasi.util.MinMaxHeap怎么 這是LingPipe 的一部分; 不幸的是,許可可能是一個問題。

請參閱此相關文件

但是,不實現decreaseKey 或increaseKey。

最小堆: PriorityQueue minHeap= new PriorityQueue<>();

Max Heap PriorityQueue maxHeap= new PriorityQueue<>(Comparator.reverseOrder());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM