दो अंक के बीच निकटतम दूरी (असंबंधित समूह)
यह समस्या दो असंबंधित समूह के बीच करीबी जोड़ी का एक प्रकार है। उपरोक्त तस्वीर इस समस्या को व्यक्त किया गया है। दो प्रकार के डिजॉइंट सेट, एक्स प्लेन में ब्लू डॉट्स, + एक्स प्लेन में लाल डॉट्स हैं।
मैं कम से कम दूरी की गणना करना चाहते हैं (दूरी है | y2-y1 | + | x2 - x 1 |) एक नीले डॉट और एक लाल डॉट के बीच, और मैं दूरी को खोजने के लिए लगता है कि उपयोग द्विआधारी खोज। द्विआधारी खोज इस तरह की समस्या का उपयोग कैसे करें? मैं केवल पर बाइनरी खोज को दो डिजॉइंट सेट व्यक्त करने पर संघर्ष करता हूं। मैं पहले से ही एक सेट के लिए जानता हूं, लेकिन मुझे दो अलग-अलग सेटों के मामले में पता नहीं है।
++) यह डेलाउन त्रिभुज का उपयोग कर रैखिक समय में हो सकता है? (आह, यह केवल मेरी जिज्ञासा है, मैं बाइनरी खोज का उपयोग करना चाहता हूं)
कोड के नीचे जो मैंने पहले से ही एक सेट केस कोडिंग (समस्या सुलझाने की तकनीक, विभाजन और कोंककर का उपयोग करके) और दो अपमान सेट को कवर किया था। मुझे समझ में नहीं आता कि दो सेट में कैसे करना है। उदाहरण, संकेत। ठीक है .. कृपया कोई मेरी मदद करो?
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <cmath>
/**
test input
10
-16 -4
-1 -3
-9 -1
-4 -10
-11 -6
-20 4
-13 6
-3 -10
-19 -1
-12 -4
10
8 2
10 3
10 10
20 -3
20 3
16 2
3 -5
14 -10
8 -2
14 0
10
-3 39
-2 -28
-1 20
-3 11
-3 45
-2 -44
-1 -47
-5 -35
-5 -19
-5 -45
10
27 5
28 0
28 5
21 5
2 3
13 -1
16 -2
20 -2
33 -3
27 1
**/
using namespace std;
const int MAX = 10001;
struct point{
int x,y;
};
bool xCompare(struct point, struct point);
bool yCompare(struct point, struct point);
int dis(struct point, struct point);
int absd(int);
int trace(int,int,int,int);
point p[MAX], q[MAX], tmp[MAX];
int main(){
int left;
int right;
scanf("%d\n", &left);
memset(p,0,sizeof(p));
memset(q,0,sizeof(q));
memset(tmp,0,sizeof(tmp));
for(int i=0; i<left; i++){
cin >> p[i].x >> p[i].y;
}
scanf("%d\n", &right);
for(int j=0; j<right; j++){
cin >> q[j].x >> q[j].y;
}
sort(p, p+left, xCompare);
sort(q, q+right, xCompare);
int min = trace(0,0, left-1, right-1);
printf("%d\n", min);
/** this is one set case.
while(true){
cin >> n;
if(n == 0) break;
memset(p,0,sizeof(p));
memset(tmp,0,sizeof(tmp));
for(int i= 0;i<n;i++)
cin >> p[i].x >> p[i].y;
sort(p,p+n,xCompare);
int min = trace(0,n-1);
if(min < 10000 && n > 1){
cout << fixed;
cout << setprecision(4) << min << endl;
}
else
cout << "INFINITY" << endl;
}
**/
return 0;
}
int trace(int low1, int low2, int high1, int high2){
if(high1 - low1 < 3){
int value = dis(p[low1],q[low2+1]);
int nextValue;
if(high1 - low1 == 2){
nextValue = dis(p[low1],q[low2+2]);
if(value > nextValue)
value = nextValue;
nextValue = dis(p[low1+1],q[low2+2]);
if(value > nextValue)
value = nextValue;
}
return value;
}
else{
/* DIVIDE & QONQUER */
int mid1 = (low1 + high1) >> 1;
int mid2 = (low2 + high2) >> 1;
int cnt = 0;
int leftValue = trace(low1,low2,mid1,mid2); // left trace
int rightValue = trace(mid1+1,mid2+1,high1,high2); // right trace
// min value find
int value = leftValue < rightValue ? leftValue : rightValue;
/* Middle Condition Check : Y Line */
// saving left
for(int i = low1;i<=mid1;i++){
if(abs(p[i].x - q[mid2].x) <= value)
tmp[cnt++] = p[i];
}
// saving right
for(int i = mid1+1;i<=high1;i++){
if(absd(p[i].x - q[mid2+1].x) <= value)
tmp[cnt++] = p[i];
}
sort(tmp,tmp+cnt,yCompare);
for(int i = 0;i<cnt;i++){
int count = 0;
for(int j = i-3;count < 6 && j < cnt;j++){
if(j >= 0 && i != j){
int distance = dis(tmp[i],tmp[j]);
if(value > distance)
value = distance;
count++;
}
}
}
return value;
}
}
int absd(int x){
if(x < 0)
return -x;
return x;
}
int dis(struct point a, struct point b){
return (abs(a.x-b.x) + abs(a.y-b.y));
}
bool xCompare(struct point a, struct point b){
return a.x < b.x;
}
bool yCompare(struct point a, struct point b){
return a.y < b.y;
}
यह एक निकटतम पड़ोसी समस्या है। http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm और यह होमवर्क समस्या की तरह लगता है। क्या यह होमवर्क है? – madmik3
मैं एसीएम समस्याओं को हल करता हूं ~ :) विशेष रूप से कम्प्यूटेशनल ज्यामिति, ग्राफ। – Silvester
डेलयूने त्रिभुज में न्यूनतम स्पैनिंग पेड़ होता है, जिसमें बदले में सबसे सस्ता किनारा कट (नीले बिंदुओं, लाल बिंदु) को पार करता है। – Per