【问题标题】:What is the Time Complexity of a PriorityQueue add() and poll() in this case在这种情况下,PriorityQueue add() 和 poll() 的时间复杂度是多少
【发布时间】:2021-06-22 21:00:07
【问题描述】:

如果我有一个大小为 4 的 PriorityQueue,并且我正在迭代一个大小为“n”的数组,并且我只想要数组中的 4 个最大元素。当我到达数组的末尾时,这个程序是否花费了 O(n) 时间或 O(nlogn) 时间。我知道 PQ add() 和 remove() 需要 O(logn),但是因为 PQ 大小永远不会大于 4,这是否意味着这是一个 O(n) 程序。

这里是代码,如果你想参考

class Solution {
    public int minDifference(int[] nums) {
        if(nums.length <= 4) return 0;
       PriorityQueue<Integer> maxq = new PriorityQueue();
       PriorityQueue<Integer> minq = new PriorityQueue(new Comparator<Integer>(){
           public int compare(Integer a, Integer b){
               return (a - b) * -1;
           }
       });
      
        for(int i = 0; i < nums.length; i++){
            if(minq.size() < 4){
                minq.add(nums[i]);
                maxq.add(nums[i]);
            }else
            {
            
            if(nums[i] > maxq.peek()){
                maxq.poll();
                maxq.add(nums[i]);
            }
            
            if(nums[i] < minq.peek()){
                minq.poll();
                minq.add(nums[i]);
            }
            }
        }
        
        int smallest4 =  minq.poll();
        int smallest3 = minq.poll();
        int smallest2 = minq.poll();
        int smallest = minq.poll();
        
        int biggest4 = maxq.poll();
        int biggest3 = maxq.poll();
        int biggest2 = maxq.poll();
        int biggest = maxq.poll();
        
        int remove3End = biggest4 - smallest;
        int remove3Beg = biggest - smallest4;
        int twoEnd_oneStart = biggest3 - smallest2;
        int oneEnd_twoStart = biggest2 - smallest3;
        
        int a = Math.min(remove3End,remove3Beg);
        int b = Math.min(twoEnd_oneStart, oneEnd_twoStart);
        
        return Math.min(a,b);

        
        
    }
}```

【问题讨论】:

    标签: queue time-complexity big-o priority-queue


    【解决方案1】:

    我知道 PQ add() 和 remove() 需要 O(logn),但是因为 PQ 大小永远不会大于 4,这是否意味着这是一个 O(n) 程序?

    是的,你是对的。 O(logn)中的n其实是4,所以变成了O(log4),也就是O(1)。所以你可以说add()remove() 在你的情况下以恒定的时间运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多