最小圆覆盖模板
//最小圓覆蓋
//輸入: 從下標0開始的點集_ps和大小_n
//輸出: 覆蓋所有點的最小圓
//復雜度: O(n)
//注意: 會對_ps進行隨機處理操作,將會改變點集的內(nèi)部順序
Circle MinCoverCir(Point _ps[],int _n)
{//隨機處理,但是會改變傳入的點集。random_shuffle(_ps, _ps+_n);//復雜度O(_n)
Circle rec;rec.r = 0;rec.c = _ps[0];for(int i=1;i<_n;i++){if(GT( Dis(rec.c,_ps[i]),rec.r ) )//i點在圓外
{rec.r = 0;rec.c = _ps[i];for(int j=0;j<i;j++){if( GT( Dis(rec.c,_ps[j]),rec.r ) )//j在圓外
{rec.c.x = (_ps[i].x+_ps[j].x)/2.0;rec.c.y = (_ps[i].y+_ps[j].y)/2.0;rec.r = Dis(_ps[i],_ps[j])/2.0;for(int k=0;k<j;k++){if( GT( Dis(rec.c,_ps[k]),rec.r ) )//k在圓外
{rec=OutCircle(_ps[i], _ps[j], _ps[k]);}}}}}}return rec;
}
為什么這樣做,我覺得看代碼比看解釋清晰的多。 最關鍵需要證明的一步在于,為什么在確定i,j必在圓上后,當出現(xiàn)一個不在圓內(nèi)的點k時,用i,j,k的外接圓代替。這個畫幾個圖用點幾何知識即可證明。然后理論復雜度是O(n)的,看起來雖然是n^3,但是每一層往下的可能都是log的,所以平均起來最多是O(n+(logn)^3) = O(n)。這個算法真是尼瑪巧妙。
總結
- 上一篇: 操作系统---进程篇
- 下一篇: iOS中 陀螺仪/加速器 韩俊强的博客