日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文介紹了Java PriorityQueue:如何使用自定義比較器堆積集合?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

問題描述

例如,給定一個(gè)整數(shù)列表List<Integer> list = Arrays.asList(5,4,5,2,2),我如何在O(n)時(shí)間復(fù)雜度內(nèi)從該列表中獲得maxHeap

天真的方法:

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for (Integer i : list) {
    maxHeap.offer(i);
}

但是,時(shí)間復(fù)雜度是O(nlogn)

我們可以使用以下構(gòu)造函數(shù)觸發(fā)heapify方法:

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(list);

時(shí)間復(fù)雜度為O(n)。但是,它迫使我使用自然順序,即minHeap

我的問題:

如何通過使用自定義比較器堆積集合來構(gòu)造PriorityQueue?

參考文獻(xiàn):
Java doc of PriorityQueue

PS:
@user207421
Heapify算法可以在O(n)時(shí)間內(nèi)將任何未排序的數(shù)組轉(zhuǎn)換為堆,而不是O(nlogn)。There are many articles about heapify,同樣在CLRS的算法簡(jiǎn)介第159頁(yè)中,從任何未排序的數(shù)組構(gòu)建堆是O(n)。而heap也不是排序數(shù)組。它是一個(gè)完整的樹,具有堆屬性,可以在數(shù)組中編碼。

推薦答案

如果您不介意黑客攻擊

根據(jù)java doc of PriorityQueue(PriorityQueue)

創(chuàng)建包含指定優(yōu)先級(jí)隊(duì)列中的元素的PriorityQueue。此優(yōu)先級(jí)隊(duì)列將按照與給定優(yōu)先級(jí)隊(duì)列相同的順序進(jìn)行排序。

因此我們可以擴(kuò)展PriorityQueueAsCustomComparatorPriorityQueue以保存所需的比較器和我們需要堆積的集合。然后使用CustomComparatorPriorityQueue的實(shí)例調(diào)用newPriorityQueue(PriorityQueue)

下面的測(cè)試可以在Java 15中運(yùn)行。

import java.util.*;

public class CustomComparatorPriorityQueue<T> extends PriorityQueue<T> {
    private Collection<T> wrapped;

    public static <U> PriorityQueue<U> create(Collection<U> wrapped, Comparator<U> custom) {
        return new PriorityQueue<U>(new CustomComparatorPriorityQueue<>(wrapped, custom));
    }

    private CustomComparatorPriorityQueue(Collection<T> wrapped, Comparator<T> custom) {
        super(custom);
        this.wrapped = wrapped;
    }

    @Override
    public Object[] toArray() {
        return wrapped.toArray();
    }

    public static void main(String[] args) {
        List<Integer> a = Arrays.asList(3, 6, 4, 8, 1, 9);
        PriorityQueue<Integer> pq = CustomComparatorPriorityQueue.create(a, Comparator.<Integer>naturalOrder().reversed());
        Integer b;
        while ((b = pq.poll()) != null) {
            System.out.println(b);
        }
    }

    // Override to don't allow other purpose...
}

這篇關(guān)于Java PriorityQueue:如何使用自定義比較器堆積集合?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,

分享到:
標(biāo)簽:Java PriorityQueue 堆積 如何使用 自定義 集合
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定