[英]{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);
}
}
题:
第35行,第39行的时间复杂度是独立和单独的?
第35-40行(整体而言)的时间复杂度是多少?
第44-46行(整体而言)的时间复杂度是多少?
整个方法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.