Diberikan sebuah larik yang berisi N titik, temukan K titik terdekat dengan titik asal (0, 0) pada bidang 2D. Anda dapat mengasumsikan K jauh lebih kecil dari N dan N sangat besar.
Misalnya:
given array: (1,0), (3,0), (2,0), K = 2 Result = (1,0), (2,0)
(hasil harus dalam urutan menaik berdasarkan jarak)
Kode:
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);
}
}
Pertanyaan:
Berapa kompleksitas waktu untuk baris 35, baris 39, mandiri dan terpisah?
Berapa kompleksitas waktu untuk baris 35 - 40 (Secara keseluruhan) ?
Berapa kompleksitas waktu untuk baris 44 - 46 (Secara keseluruhan) ?
Berapa kompleksitas waktu keseluruhan untuk seluruh metode getKNearestPoints(), dalam kasus terbaik, terburuk, dan rata-rata? Bagaimana jika n >> k ? dan bagaimana jika kita tidak memiliki n >> k ?
Sebenarnya pertanyaan-pertanyaan ini adalah beberapa pertanyaan selama wawancara teknis saya, tetapi saya masih agak bingung. Bantuan apa pun dihargai.
1 menjawab
Dari kelihatannya, saya pikir orang yang menulis kode ini pasti tahu jawaban atas pertanyaan-pertanyaan ini.
Bagaimanapun, Antrian Prioritas di sini didasarkan pada implementasi Max Heap.
Jadi, kompleksitasnya adalah sebagai berikut:
Baris 35 - O(log k)
Waktu untuk menyisipkan elemen di heap. Pendekatan bottom up diikuti di heap pada saat penyisipan.
Baris 37 - O(1)
, Waktu untuk memeriksa ukuran tumpukan, umumnya dipertahankan bersama dengan tumpukan.
Baris 39 - O(log k)
, Waktu untuk menghilangkan kepala tumpukan, pendekatan heapify pada akar tumpukan diterapkan untuk menghilangkan bagian atas tumpukan tumpukan.
Baris 35-40: Dari kompleksitas di atas kita dapat melihat bahwa kompleksitas keseluruhan dari satu iterasi adalah O(log k)
. Loop ini berjalan untuk elemen n
, sehingga kompleksitas keseluruhannya adalah O(n log k)
.
Baris 44-46: Kompleksitas pemeriksaan ukuran heap lagi O(1)
, dan polling adalah O(log k)
. Jadi kami melakukan polling k
kali. Kompleksitas keseluruhan loop akan menjadi O(k log k)
.
Kompleksitas keseluruhan akan tetap O(n log k)
.
Ini adalah tempat yang bagus untuk mempelajari topik ini.