求取輸入點集最近點對的距離
相比於對所有點對窮舉,並得出結果的方式相比,
本演算法時間複雜度為θ(nlg(n)),優於窮舉下的θ(n^2)
extern "c" class algorithmlib mindistance
; class flagpoint
; mindistance();
~mindistance();
double run(const datastruct::array::dynarray>& poarr_);
private:
double calculatemindistance(
const datastruct::array::dynarray& arrpos_,
const datastruct::array::dynarray& arrsortedbyx_,
const datastruct::array::dynarray& arrsortedbyy_);
};
mindistance::flagpoint::flagpoint()
mindistance::flagpoint::flagpoint(math::point<2>* ppo_, flag nflag_)
mindistance::flagpoint::~flagpoint()
mindistance::mindistance()
mindistance::~mindistance()
double mindistance::run(const datastruct::array::dynarray>& arrpos_)
datastruct::array::dynarray_parrfpossortedbyx = _parrfpo;
_parrfpossortedbyx.sort(
(const flagpoint*& po1_, const flagpoint*& po2_)
else if (_nret < 0.0)
else
});datastruct::array::dynarray_parrfpossortedbyy = _parrfpo;
_parrfpossortedbyy.sort(
(const flagpoint*& po1_, const flagpoint*& po2_)
else if (_nret < 0.0)
else
});double _nmin = calculatemindistance(
_parrfpo,
_parrfpossortedbyx,
_parrfpossortedbyy);
for (int _i = 0; _i < _nsize; _i++) }
double mindistance::calculatemindistance(
const datastruct::array::dynarray& parrfpos_,
const datastruct::array::dynarray& parrfpossortedbyx_,
const datastruct::array::dynarray& parrfpossortedbyy_)
double _nd = geometry::getdistance(parrfpos_[_i]->m_pop, parrfpos_[_j]->m_pop);
if (_nmindistance < _nd)
}} return _nmindistance;
} // 對n個節點做型別劃分
for (int _i = 0; _i < _nsize; _i++)
else
}// 劃分為兩個集合
datastruct::array::dynarray_parrposleft;
datastruct::array::dynarray_parrleftsortedbyx;
datastruct::array::dynarray_parrleftsortedbyy;
datastruct::array::dynarray_parrposright;
datastruct::array::dynarray_parrrightsortedbyx;
datastruct::array::dynarray_parrrightsortedbyy;
for (int _i = 0; _i < _nsize; _i++)
else
if (parrfpossortedbyx_[_i]->m_nflag == flag::left)
else
if (parrfpossortedbyy_[_i]->m_nflag == flag::left)
else
}double _nmindleft = calculatemindistance(_parrposleft, _parrleftsortedbyx, _parrleftsortedbyy);
double _nmindright = calculatemindistance(_parrposright, _parrrightsortedbyx, _parrrightsortedbyy);
double _nmin = std::fmin(_nmindleft, _nmindright);
datastruct::array::dynarray_parrmidareasortedbyy;
double _nmiddlex = parrfpossortedbyx_[_nsize / 2]->m_pop.m_npos[0];
for (int _i = 0; _i < _nsize; _i++) }
int _nmiddleareasize = _parrmidareasortedbyy.getsize();
for (int _i = 0; _i < _nmiddleareasize; _i++) }
return _nmin;
}
演算法思想:
演算法:求取輸入點集a最小距離
若點集a中,點的個數小於或等於3,直接給出結果。
對點集a一分為二,al,ar
對al,ar分別用演算法求取al,ar最小距離d_al,d_ar
令d = min(d_al, d_ar)
處理,最小距離兩點乙個位於al,乙個位於ar的情形
構造以中線兩邊距離中線距離為d或不足d的點構成的點集p
對點集p中點按y座標排序
對點集p中每個點,依次與其後7個點比較。
如此,得到乙個p中點的最小距離d_p
返回min(d, d_p)
最短距離的點 ACM
給出一些整數對,它們表示一些平面上的座標點,給定乙個點,求所有那些點到該點最短距離的點。結構為 第乙個整數對為所給定的點,後面的整數對為所有其他的點。第乙個整數對為所給定的點,後面的整數對為所有其他的點。到第乙個點最短距離的點 樣例輸入 9 21 0 1 10 0 1 22 1 樣例輸入 2 1 i...
求球面兩點最短距離
problem 給定球的半徑,兩點的經緯度,求這兩點間的最短距離。solution 球面兩點間距離公式 r acos cos wa cos wb cos jb ja sin wa sin wb r代表半徑,wa是a點的緯度,wb是b點的緯度,ja是a點的經度,jb是b點的經度,去北緯為正,東經為正。...
C 兩點之間最短距離
兩點之間最短距離 這是我的乙個測試,也是我學習html的 起點,他們說乙個合格的程式設計師必須學會html,我比他們起步晚了一些,可是我認為還來的及,以後我就用html來記錄我的學習記錄了。問題的提出 在二維平面的n個點上,找出其中的一對點,使得在n個點組成的所有的點中,該點對的距離最小。方法一 暴...