簡體   English   中英

Java TreeSet使用的內存是否少於PriorityQueue?

[英]Does Java TreeSet uses less memory than PriorityQueue?

我正在做這個問題並首先使用PriorityQueue解決了它:-

public ArrayList<Integer> solve(int A, int B, int C, int D) {
    PriorityQueue<Integer> q = new PriorityQueue<>();
    q.add(A);
    q.add(B);
    q.add(C);
    ArrayList<Integer> list = new ArrayList<>();
    while(list.size() < D){
        int val = q.poll();
        if(list.size() == 0 || list.get(list.size() - 1) != val)
        list.add(val);
        q.add(val*A);
        q.add(val*B);
        q.add(val*C);
    }

    list.sort(null);
    return list;
}

但是它給出了java.lang.OutOfMemoryError:Java堆空間錯誤。
用TreeSet替換PriorityQueue后,該解決方案被接受:-

 public ArrayList<Integer> solve(int A, int B, int C, int D) {
    ArrayList<Integer> res = new ArrayList<>() ;

    TreeSet<Integer> set = new TreeSet<>() ;
    set.add(A) ;
    set.add(B) ;
    set.add(C) ;

    for(int i = 0; i < D; i++) {
        int temp = set.first() ;
        set.remove(temp) ;
        res.add(temp) ;

        set.add(temp*A) ;
        set.add(temp*B) ;
        set.add(temp*C) ;

    }
    return res ;
}

基本上,它與使用的內存量無關,只是使用PriorityQueue的程序PriorityQueue無休止,一遍又一遍地向PriorityQueue添加元素。

它不會結束,因為您的條件if(list.size() == 0 || list.get(list.size() - 1) != val) -它永遠不會滿足,因此while循環會檢查list大小(從未更改)始終為true,因此每次循環執行都從隊列中提取1個元素,然后向其中添加3個元素。

它與數據結構無關。 第一種情況的參數組合可能導致此語句永遠不成立:

if(list.size() == 0 || list.get(list.size() - 1) != val)

這意味着循環永遠不會終止,並且對象q會增長,直到耗盡內存。 例如,嘗試致電:

solve(1,1,2,5)

在這種情況下,兩個數據結構之間的內存差異沒有影響。 需要注意的是與隨機訪問和下一個/上一個指針有關的一些差異,但這與此處無關。

暫無
暫無

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

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