簡體   English   中英

{Java - PriorityQueue}此代碼的時間復雜度

[英]{Java - PriorityQueue} time complexity of this code

給定包含N個點的數組,在2D平面中找到與原點(0,0)最近的K點。 您可以假設K遠小於N且N非常大。

例如:

  given array: (1,0), (3,0), (2,0), K = 2 Result = (1,0), (2,0) 

(結果應按距離按升序排列)

碼:

import java.util.*;

class CPoint {
    double x;
    double y;
    public CPoint(double x, double y) {
        this.x = x;
        this.y = y;
    }
}

public class KClosest {
    /**
     * @param myList: a list of myList
     * @param k: the number of closest myList
     * @return: the k closest myList
     */
    public static CPoint[] getKNearestPoints(CPoint[] myList, int k) {

        if (k <= 0 || k > myList.length)  return new CPoint[]{};                                
        if (myList == null || myList.length == 0 )  return myList; 

        final CPoint o = new CPoint(0, 0); // origin point

        // use a Max-Heap of size k for maintaining K closest points
        PriorityQueue<CPoint> pq = new PriorityQueue<CPoint> (k, new Comparator<CPoint> () {
            @Override
            public int compare(CPoint a, CPoint b) {
                return Double.compare(distance(b, o), distance(a, o));  
            }
        });

        for (CPoint p : myList) {   // Line 33
            // Keep adding the distance value until heap is full. // Line 34
            pq.offer(p);            // Line 35
            // If it is full        // Line 36
            if (pq.size() > k) {    // Line 37
                // Then remove the first element having the largest distance in PQ.// Line 38
                pq.poll();          // Line 39  
            }  // Line 40
        }       
        CPoint[] res = new CPoint[k];
        // Then make a second pass to get k closest points into result. 
        while (!pq.isEmpty()) {     // Line 44
            res[--k] = pq.poll();   // Line 45                   
        }                           // Line 46

        return res;
    }

    private static double distance(CPoint a, CPoint b) {        
        return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
    }

}

題:

  1. 第35行,第39行的時間復雜度是獨立和單獨的?

  2. 第35-40行(整體而言)的時間復雜度是多少?

  3. 第44-46行(整體而言)的時間復雜度是多少?

  4. 整個方法getKNearestPoints()的整體時間復雜度是什么,在最佳,最差和平均情況下? 如果n >> k怎么辦? 如果我們沒有n >> k怎么辦?

實際上這些問題在我的技術面試中有幾個問題,但我仍然對此感到困惑。 任何幫助表示贊賞。

從它的外觀來看,我認為編寫此代碼的人必須知道這些問題的答案。

無論如何,Priority Queue基於Max Heap實現。

所以,復雜性如下:

第35行 - O(log k)在堆中插入元素的時間。 在插入時堆中遵循自下而上的方法。

第37行 - O(1) ,檢查堆大小的時間,通常是與堆一起維護的。

第39行 - O(log k) ,刪除堆頭的時間,堆根部的堆化方法應用於刪除堆的頂部。

第35-40行 :從上述復雜性我們可以看出,一次迭代的總體復雜度將為O(log k) 該循環針對n元素運行,因此總體復雜度將為O(n log k)

第44-46行 :檢查堆大小的復雜性是O(1) ,輪詢是O(log k) 所以我們正在進行k次投票。 循環的總體復雜度將為O(k log k)

總體復雜性將保持為O(n log k)

是研究這個主題的一個很棒的地方。

暫無
暫無

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

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