Düzlemde verilen bir nokta kümesindeki birbirine en yakın iki noktayı (Closest Pair) bulmak için kullanılan Böl-ve-Fethet algoritmasıdır.
Yakınlık problemleri, veri madenciliği, fizik simülasyonları ve rota optimizasyonlarında sıklıkla karşımıza çıkar. Naif bir ikili kıyaslama (pairwise check) O(N^2) adım gerektirir.
En Yakın Çift (Closest Pair) Böl-ve-Fethet (Divide and Conquer) algoritması, noktaları x koordinatına göre ortadan ikiye bölerek problemi iki alt bölgeye indirger. Alt bölgelerdeki en küçük mesafeyi (d) bulduktan sonra, sınır şeridindeki (strip) noktaları y koordinatına göre sıralı şekilde tarar.
Sınır şeridindeki her noktanın d mesafesinde en fazla sabit sayıda (geometrik olarak en fazla 7-8) komşusu olabileceği için, şerit içi tarama doğrusal zamanda tamamlanır. Bu sayede genel çözüm O(N log N) süresine çekilir.
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.
1function distance(p1: [number, number], p2: [number, number]): number {2 return Math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2);3}45function closestPairRecursive(ptsX: [number, number][], ptsY: [number, number][]): number {6 const n = ptsX.length;7 if (n <= 3) {8 let minD = Infinity;9 for (let i = 0; i < n; i++) {10 for (let j = i + 1; j < n; j++) {11 minD = Math.min(minD, distance(ptsX[i], ptsX[j]));12 }13 }14 return minD;15 }1617 const mid = Math.floor(n / 2);18 const midPoint = ptsX[mid];1920 // Noktaları sol ve sağ olarak ayır21 const leftX = ptsX.slice(0, mid);22 const rightX = ptsX.slice(mid);2324 const leftY = ptsY.filter((p) => p[0] <= midPoint[0]);25 const rightY = ptsY.filter((p) => p[0] > midPoint[0]);2627 const dl = closestPairRecursive(leftX, leftY);28 const dr = closestPairRecursive(rightX, rightY);29 let d = Math.min(dl, dr);3031 // Şerit tespiti32 const strip = ptsY.filter((p) => Math.abs(p[0] - midPoint[0]) < d);3334 for (let i = 0; i < strip.length; i++) {35 for (let j = i + 1; j < strip.length && (strip[j][1] - strip[i][1]) < d; j++) {36 d = Math.min(d, distance(strip[i], strip[j]));37 }38 }3940 return d;41}Noktaları x,y çiftleri halinde girin. Böl ve Fethet ile en yakın çift bulunacaktır. Örnek: 2,3; 12,30; 40,50; 5,1; 12,10; 3,4
Noktaları x,y çiftleri halinde girin. Böl ve Fethet ile en yakın çift bulunacaktır. Örnek: 2,3; 12,30; 40,50; 5,1; 12,10; 3,4
En İyi Durum: O(N log N) Böl-ve-Fethet ile
Ortalama Durum: O(N log N)
En Kötü Durum: O(N log N)
O(N) rekürsif bölmeler için y ve x koordinat dizileri - Bu algoritmanın karmaşıklığı belirtilmemiş.
Yakınlık Problemleri (Proximity Problems) Algoritması ile benzer veya alternatif olarak değerlendirilebilecek diğer başlıklar: