BÀI TOÁN cặp điểm gần NHẤT

10 1.1K 4
BÀI TOÁN cặp điểm gần NHẤT

Đang tải... (xem toàn văn)

Thông tin tài liệu

BI TON CP IM GN NHT I M u Đa số thuật toán tập trung xử lí văn (xử lí xâu) số, chúng đợc thiết kế xử lí sẵn phần lớn toán lập trình Đối với toán hình học đòi hỏi khác hẳn, ngời lập trình phải có tính toán tỉ mỉ công thức hình học trớc vào lập trình Khi làm tập hình học thờng phải đòi hỏi công phu lập trình tập khác, việc thiết lập công thức lập trình có hiệu Đối tợng hình học Trong toán Tin học thuộc loại hình học có đối tợng là: Điểm, Đoạn thẳng Đa giác Điểm: Đợc xét cặp số nguyên tọa độ điểm hệ trục tọa độ Descartes thờng dùng Đoạn thẳng: Là cặp điểm đợc nối với phần đờng thẳng Đa giác: Là dãy điểm với hai điểm liên tiếp đợc nối đoạn thẳng, điểm đầu đợc nối với điểm cuối tạo thành hình gấp khúc khép kín Dữ liệu lu trữ đối tợng hình học Làm việc với đối tợng hình học cần định thể chúng nh nào? Thông thờng ta dùng mảng để biểu diễn đa giác, số trờng hợp khác dùng danh sách liên kết hay kiểu khác Đối tợng thờng xuyên phải làm việc với hình học tọa độ, việc lu trữ toạ độ điểm phổ biến toán lập trình hình học II Ni dung Phỏt biu bi toỏn Bi toỏn: Cho im trờn mt mng ta , tỡm khong cỏch ngn nht gia hai im bt k Thut toỏn Bi toỏn ny ta cú th d dng thc hin thut toỏn , ta xột tt c cỏc cp im v chn cp cú khong cỏch ngn nht gia chỳng Thut toỏn cú phc Ta cú mt s thut toỏn tt hn nh sau: 2.1.Thut toỏn chia tr a í tng thut toỏn Thut toỏn chia tr gii quyt bi toỏn ny thc hin nh sau: Sp xp cỏc im ó cho theo th t t trỏi sang phi Chia im thnh hai Thc hin thao tỏc quy, tỡm cp im gn nht hai con, tr li giỏ tr l khong cỏch ngn nht ú Gi l khong cỏch ngn nht, hai khong cỏch ngn nht hai Ta ch quan tõm ti cỏc cp cú khong cỏch nh hn Xột ca s rng , sp xp tt c cỏc im ca s ú theo th t tng dn chiu ta Nhn xột: vỡ khong cỏch gia mi cp im bt k trờn hai khụng nh hn nờn vi mi mt im trờn ca s, cú khụng quỏ im mi bờn cú khong cỏch nh hn hoc bng so vi im ú Do vy, vi mi im, ta ch cn xột (ghộp cp) khụng quỏ im cú th tỡm cp im cú khong cỏch Euclid nh hn b Ci t S dng quy quay lui ci t thut toỏn Vi mi on: Nu di on , ta tớnh toỏn bruteforce tỡm cp im gn nht Nu di ta chia ụi tp, quy quay lui tớnh khong cỏch gn nht hai con, chn giỏ tr nht hai khong cỏch Dựng mng trn hai phớa theo th t tng dn , lc ly nhng phn t cú chờnh lch nh hn giỏ tr ang cú () Chỳ ý sau thc hin, ta thc hin sp xp trn hai phớa ca on theo th t tng dn y luụn, phc , khụng s dng thut toỏn sp xp khỏc Vi cỏc phn t ca s, vi mi im, xột cỏc im lõn cn (sau ó sp xp) cú chờnh lch nh hn (s phn t ny Di õy l chng trỡnh ci t tớnh cp im gn nhttheo thut toỏn chia tr: Input: Dũng u tiờn l s s lng im dũng tip theo, mi dũng cha ta mt im theo th t Output: Khong cỏch nh nht cn tỡm, chớnh xỏc ch s phn thp phõn CLOSESTPAIR.INP 1 2 CLOSESTPAIR.OUT 1.00000 Chng trỡnh: #include #define sz(x) int(x.size()) #define MIN(x,y) if (x < y) x = y #define PB push_back #define mp make_pair #define Task "closestpair" #define maxn 200002 #define MOD 1000000007 #define remain(x) if (x > MOD) x -= MOD #define pii pair #define X first #define Y second using namespace std; pii a[maxn], strip[maxn]; double ans = 1e10; double Distance(pii P1, pii P2) { double XX = P1.X - P2.X; double YY = P1.Y - P2.Y; return sqrt(XX*XX + YY*YY); } double bruteForce(pii P[], int n) { double kmin = FLT_MAX; for (int i = 0; i < n; i++) for (int j = i+1; j < n; j++) kmin = min(kmin, Distance(P[i], P[j])); return kmin; } bool compareY(pii p1, pii p2) { return (p1.Y < p2.Y || (p1.Y == p2.Y && p1.X < p2.X)); } double stripClosest(pii strip[], int n, double d) { double kmin = d; for (int i = 0; i < n; ++i) for (int j = i+1; j < n && (strip[j].Y - strip[i].Y) < kmin; j++) kmin = min(Distance(strip[i],strip[j]), kmin); return kmin; } double Calc(pii P[], int n) { if (n > n; for (int i = 0; i < n; i++) cin >> a[i].X >> a[i].Y; printf("%0.5f", Closest(a,n)); return 0; } c ỏnh giỏ Vic tớnh ca s v sp xp trn vi mt on di (khụng tớnh hai on con) cú phc O(n) S ln lp th tc tớnh cú li gi khụng quỏ ln nờn tng phc thut toỏn l 2.2.Thut toỏn sweep line a í tng thut toỏn Sp xp ta cỏc im theo chiu Xột tng im t trỏi qua phi Gi s ta ang xột ti im v giỏ tr nh nht gia hai im cỏc im bờn trỏi l Rừ rng ta ch gi li nhng im cú khong cỏch ti ta ca l (hỡnh trỏi) Vi im ta ch cn xột nhng im cú chờnh lch c v so vi khụng quỏ (hỡnh bờn phi) D thy, vỡ l khong cỏch ngn nht gia im im bờn trỏi ó xột nờn chc chn cú khụng b quỏ im nh vy Ci t S dng thờm cu trỳc set lu tr cỏc phn t vt quột hay núi cỏch khỏc l cỏc phn t cú ta x cú khong cỏch ti ta x ca p ang xột nh hn giỏ tr d hin ti ng thi d rng thờm, xúa v tỡm kim cỏc phn t phm vi Di õy l chng trỡnh ci t tớnh cp im gn nhttheo thut toỏn sweepline: #include #define sz(x) int(x.size()) #define MIN(x,y) if (x < y) x = y #define PB push_back #define mp make_pair #define F first #define S second #define Task "closestpair" #define maxn 200002 #define MOD 1000000007 #define remain(x) if (x > MOD) x -= MOD #define pii pair #define Y first #define X second using namespace std; pii a[maxn]; set S; double Distance(pii P1, pii P2) { double XX = P1.X - P2.X; double YY = P1.Y - P2.Y; return sqrt(XX*XX + YY*YY); } bool compareX(pii p1, pii p2) { return (p1.X < p2.X || (p1.X == p2.X && p1.Y < p2.Y)); } double Closest(pii a[], int n) { sort(a, a+n, compareX); S.insert(a[0]); int left = 0; double ans = 1e10; for (int i = 1; i < n; i++) { int py = a[i].Y; int px = a[i].X; while (a[left].X < px - ans) S.erase(a[left++]); for (set :: iterator it = S.lower_bound(mp(1.0*py-ans, 1.0*px-ans)); it != S.end() && it->Y < ans+py; it++) ans = (ans, Distance(*it, a[i])); S.insert(a[i]); } return ans; } int main() { ios_base::sync_with_stdio(0); freopen(Task".inp", "r", stdin); freopen(Task".out", "w", stdout); int n; cin >> n; for (int i = 0; i < n; i++) cin >> a[i].X >> a[i].Y; printf("%0.5f", Closest(a,n)); return 0; } c ỏnh giỏ Mi im c thờm vo v xúa i Set ỳng ln nờn thi gian x lớ thờm vo v xúa i trờn Set l Vi mi im vic tỡm v trớ bt u cú ta phm vi (hm lower-bound) mt chi phớ thi gian S im thuc hỡnh ch nht cú th xột luụn khụng vt quỏ Do vy, tng phc thc hin gii thut l III.Kt lun Vi bi toỏn cp im gn nht, c hai thut toỏn chia tr v sweepline ó trỡnh by trờn u cú phc l Vic ci t thut toỏn sweepline c ci t n gin, ngn gn hn (khi s dng ngụn ng C++) Tuy nhiờn, v mt thi gian, thut toỏn chia tr li thc hin hiu qu hn vic x lý Set C++ tn nhiu thi gian hn Ti liu tham kho Thomas H.Cormen, Charles E Leiserson, Ronald L Rivest, Clifford Stein, Introduction To Algorithms, Third Edition Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars, Computational Geometry Algorithms and Appliacitons, Third Edition 10 .. .Bài toán ta dễ dàng thực thuật toán , ta xét tất cặp điểm chọn cặp có khoảng cách ngắn chúng Thuật toán có độ phức tạp Ta có số thuật toán tốt sau: 2.1.Thuật toán chia để trị... Ý tưởng thuật toán Thuật toán chia để trị giải toán thực sau: • Sắp xếp điểm cho theo thứ tự từ trái sang phải Chia tập điểm thành hai tập • Thực thao tác đệ quy, tìm cặp điểm gần hai tập con,... cặp điểm hai tập không nhỏ nên với điểm “cửa sổ”, có không điểm bên có khoảng cách nhỏ so với điểm Do vậy, với điểm, ta cần xét (ghép cặp) không điểm để tìm cặp điểm có khoảng cách Euclid nhỏ b

Ngày đăng: 03/01/2016, 21:35

Tài liệu cùng người dùng

Tài liệu liên quan