2D düzlemde koordinatları verilen noktaları hiyerarşik olarak bölerek sorgulayan 2D-Ağaç (2D-Tree) veri yapısı ve dikdörtgensel aralık arama (Range Search) algoritmasıdır.
Uzamsal arama, uzaydaki çok sayıda noktanın belirli bir alan (range) içinde kalanlarını hızlıca süzmek için kullanılan hiyerarşik indeksleme yöntemidir.
2D-Ağaç (2D-Tree), ikili arama ağacının iki boyuta genel sürümüdür. Ağacın kök düğümü x koordinatına göre düzlemi dikey olarak ikiye bölerken, çocukları y koordinatına göre yatay olarak böler. Bu bölme işlemi boyutlar arasında sırayla değişerek (X-Y-X-Y...) yaprak düğümlere kadar sürer.
Aralık Araması (Range Search) sorgusu sırasında, arama kutusu ile bölünmüş düzlem bölgeleri karşılaştırılır. Bölge arama kutusuyla kesişmiyorsa o alt ağaç tamamen budanır (pruned). Böylece milyonlarca noktada arama logaritmik zamanda sonlanır.
Aşağıdaki uygulamalar PDF kaynaklarındaki pseudo kod akışını modern veri yapılarıyla ifade eder. Kenar durumları görünür bırakıldığı için örnekler doğrudan test edilebilir.
1class KDNode {2 point: [number, number];3 left: KDNode | null = null;4 right: KDNode | null = null;5 constructor(pt: [number, number]) { this.point = pt; }6}78function insertKD(node: KDNode | null, pt: [number, number], depth: number): KDNode {9 if (node === null) return new KDNode(pt);10 const cd = depth % 2; // Coordinate dimension (0 for X, 1 for Y)11 if (pt[cd] < node.point[cd]) {12 node.left = insertKD(node.left, pt, depth + 1);13 } else {14 node.right = insertKD(node.right, pt, depth + 1);15 }16 return node;17}1819function searchRangeKD(20 node: KDNode | null,21 xmin: number, ymin: number, xmax: number, ymax: number,22 depth: number,23 results: [number, number][]24) {25 if (node === null) return;2627 const [x, y] = node.point;28 if (x >= xmin && x <= xmax && y >= ymin && y <= ymax) {29 results.push(node.point);30 }3132 const cd = depth % 2;33 const val = cd === 0 ? x : y;34 const minVal = cd === 0 ? xmin : ymin;35 const maxVal = cd === 0 ? xmax : ymax;3637 if (minVal <= val) {38 searchRangeKD(node.left, xmin, ymin, xmax, ymax, depth + 1, results);39 }40 if (maxVal >= val) {41 searchRangeKD(node.right, xmin, ymin, xmax, ymax, depth + 1, results);42 }43}Aralık kutusunu ve noktaları girin. Kutudan büyük/küçük arama kontrol edilir. Format: xmin,ymin,xmax,ymax ; x1,y1; x2,y2; ... Örnek: 0,0,10,10 ; 2,3; 5,4; 9,6; 4,7; 8,1; 7,2; 12,11
Aralık kutusunu ve noktaları girin. Kutudan büyük/küçük arama kontrol edilir. Format: xmin,ymin,xmax,ymax ; x1,y1; x2,y2; ... Örnek: 0,0,10,10 ; 2,3; 5,4; 9,6; 4,7; 8,1; 7,2; 12,11
En İyi Durum: O(log N + R) R: dönen nokta sayısı
Ortalama Durum: O(log N + R)
En Kötü Durum: O(N) aşırı dengesiz ağaçlarda
O(N) ağaç düğümleri için - Bu algoritmanın karmaşıklığı belirtilmemiş.
Uzamsal ve Aralık Araması (Spatial & Range Searching) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: