有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

优先级队列Java TreeSet使用的内存是否比PriorityQueue少?

我正在做这个Questionans首先用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 ;
}

共 (1) 个答案

  1. # 1 楼答案

    这与数据结构无关。对于第一种情况,有一组参数可能会导致这一说法永远不成立:

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

    这意味着循环永远不会终止,对象q会一直增长,直到内存耗尽。例如,试着打电话给:

    solve(1,1,2,5)

    在这种情况下,两种数据结构之间的内存差异没有影响。与随机访问和下一个/上一个指针相关的一些差异需要注意,但在这里并不相关