美文网首页程序员
优化使用Priority Queue挑选Kth Largest

优化使用Priority Queue挑选Kth Largest

作者: Lyudmilalala | 来源:发表于2020-05-14 19:46 被阅读0次

    当使用Priority Queue排序找出第K个最大的对象时,一般做法是将对象按从大到小排列在队列里,然后pop out K个。这个做法的时间复杂度是O(NlogN)

        //time: O(NlogN)   space: O(N)
        public int findKthLargestMaxHeap(int[] nums, int k) {
            //large number first
            PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>((n1, n2) -> -1*(n1 - n2));
            for(int i: nums) {
                maxHeap.add(i);
            }
            while(k>1) {
                maxHeap.poll();
                k--;
            }
            return maxHeap.poll();
        }
    

    如果我们想要更有效率,其实可以将对象在队列里从小到大排列,并控制队列长度永远为K。当队列长度超过K时,推出队列头部最小的值,保证队列中的值永远是K个到目前为止的最大值。
    这样做的话,因为队列长度永远是K,所以每次插入Priority Queue的时间复杂度是O(logK),故处理完所有数据时间复杂度为O(NlogK)
    返回的时候只要取队列头部的值就行了。

        //time: O(NlogK)   space: O(K)
        public int findKthLargestMinHeap(int[] nums, int k) {
            //small number first
            PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>();
            for(int i: nums) {
                minHeap.add(i);
                if (minHeap.size()>k) {
                    minHeap.poll();
                }
            }
            return minHeap.poll();
        }
    

    其实还可以在O(N)找到Kth Largest -- Quick Select

    相关文章

      网友评论

        本文标题:优化使用Priority Queue挑选Kth Largest

        本文链接:https://www.haomeiwen.com/subject/rxlxohtx.html