平面アルゴリズムの実装上の最も近い点

平面アルゴリズムの実装上の最も近い点

O(nlogn)

一般的な例では飛行機の最も近い点は、それが優れ達することができるの複雑さ、アルゴリズムをマージすることになると(O(nlogn)\)\しかし本当に、このような複雑性を達成することはしない、実際に明らかに;。

アルゴリズムの核となるアイデア:

  1. 応じて点の集合\(X \)の順序を座標
  2. 二つの部分に分割\(S \) \(Q \) 二つの部分のそれぞれに最も近い点を見つけることを想定している\(minL \)
  3. 行うmerge、横軸の中点からの距離の主な考慮事項は超えていない\(minL \)点の集合\(M \) ワーストケース\(M \)セットサイズ\(O(N)\) ;しかし、我々は唯一セットのコンパレータ8の各要素の要素の(固定サイズの矩形が点にあたる)。したがって、複雑\(O(nlogn)\)

実装上の問題:
8つの要素を比較する必要性を見つけるためにどのように?

私は、ビューの情報ポイントに読んありません実装の最悪の場合の複雑さがたくさんあるので、実際に一定の時間が、これを達成するための8つの要素を見つけることができるようになります(\ O(2 ^ N-))\多分物事が良くなる償却しました(ロット)。

ここであり、\(O(nlognlogn)\) ;アルゴリズム
が見つかりました:思想\(M \)に応じて、コレクション要素の後\(Yは\) ソート軸ようのみ比較ポイント最大8(定数ポイント)

複雑分析:
\(F(N)2F =(N / 2)+ O(nlogn)\)
マスターthereom:
\(O(nlogn 1} ^ {+ K)= O(nlognlogn)\)

例:hdu1007

コード `` `CPP / * * @Author:fridayfang * @Github:https://github.com/fridayfang * @LastEditors:fridayfang *の@Date:2020年1月6日午後07時09分57秒* @LastEditTime:2020から01 -06夜八時57分53秒* /の#include 名前空間stdを使用。#define MM(B)のmemset(A、B、はsizeof())の#define DB(X)COUT << "[" <<#X << "] =" < セレク; 構造体の点{ダブルX、Y。ポイント(){}点(ダブル_x、ダブル_y){X = _x、Y = _y;}} PS1 [MAXN]、PS2 [MAXN]。BOOL CMP1(CONSTポイント&P1、CONSTポイント&P2){IF(p1.x >1; double leftd = getn(l,mid); double rightd = getn(mid+1,r); double mm = min(leftd,rightd); // db(mm); mm = min(mm, _merge(l,mid,r,mm)); // db(l);db(r);db(mm); return mm; } double solve(){ return getn(0,n-1); } int main(){ // fast(); while(~scanf("%d",&n)&&n){ for(int i=0;i >ps1[i].x>>ps1[i].y; ps2[i].x = ps1[i].x; ps2[i].y = ps1[i].y; } sort(ps1,ps1+n, cmp1); sort(ps2,ps2+n, cmp2); printf("%.2lf\n",solve()/2.0); } } ```

おすすめ

転載: www.cnblogs.com/fridayfang/p/12158919.html