//#include #include using namespace std;
float minu=10000000;
int fff,bbb;
void insertsort(float list,float x,int a,int b);
void insertsort(float list,float x,int a,int b)
}float seperate(float x,float y,int left,int right){
int mid=(left+right)/2;
float dis=minu;
if(right-left==0)return dis;
else if(right-left==1) {
float t=dis(x[right],y[right],x[left],y[left]);
if(t>n;
cout>y[i];
//for(i=0;i
演算法思想與分析
通過遞迴劃分子空間,減小問題規模。
當子問題中點數為0返回極大值;點數為1時,返回與劃分點之間的距離。
在將n個點進行空間劃分前,先按照x座標進行排序,後依據x座標採用二分法來進行劃分。計算空間距離偽**如下:
separate(x,y,left,right){
if(right-left=0)return dis;//預設為一極大值
else if(right-left=1)return dis(xy,right,left)
//right,left為下標,同乙個點在xy陣列上下標一致
else {
ll= separate(x,y,left,mid)
rr= separate(x,y,mid,right)
dis=min(ll,rr);//記錄最小值
f=find_pos(mid,left,dis,x)
//對以按x座標排好序的點,從中間往左尋找在dis範圍內點,返回值為下標
b= find_pos(mid,right,dis,x)
//對以按x座標排好序的點,從中間往右尋找在dis範圍內點,返回值為下標
//在f-mid中按照x遞增順序選擇乙個點a,找mid-b範圍內按x遞增的一點b,
//保證ab兩點x座標之差小於等於dis,計算在範圍內符合約束條件的點對的最小值
for(int i=f;ifor(int j=mid;j<=f;j++)//可以只訪問排序後右側前6個點j<=f&&j-mid<=6
{if(x[j]-x[i]tmp =dis(x,y,i,j)
else break//不符合跳出、再從f-mid範圍內選擇一點
if(tmpreturn dis
演算法複雜度分析
因為該演算法採用分治法,將問題分解為兩個子問題,合併的複雜度為o(n),所以時間複雜度為:t(n)=2*t(n/2)+n
通過推倒得到演算法複雜度為o(n*logn)
在演算法開始前對資料有按照x軸座標排序,採用複雜度為o(n*logn)的演算法,得到最終演算法複雜度為o(n*logn)。
其中,在合併過程中,因為在選擇範圍時以左右最小值dis選取範圍,則在左側區域選擇的點,在包括中軸在內的右側區域中選一點,保證點之間距離為dis則最多存在6個點,否則dis可進一步縮小。
如下圖展示說明,鴿巢原理:
實驗結果
實驗資料:[2,2][1.5,1.5][3.5,1][1.75,1.25]為例:(輸入資料xy座標交替輸入)
二維幾何 平面最近點對
存個模板 是用分治寫的時間複雜度 nlogn 但是本題好像還有一種玄學做題法 我們充分發揚人類智慧型 將所有點全部繞原點旋轉同乙個角度,然後按x座標排序 根據數學直覺,在隨機旋轉後,答案中的兩個點在陣列中肯定不會離得太遠 所以我們只取每個點向後的5個點來計算答案 這樣速度快得飛起,在n 100000...
三維空間找最近點
菜雞只會資料很小很小的做法 給定三維空間上n個點,每個點都有xi,yi,zi三個座標值 找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入描述 第一行輸入整數n,2 n 1e5 第二行到第n 1行,每行輸入xi,yi,zi三個整數,代表第i個點的座標 1e4 xi,y...
二維空間中的聲線模擬
感覺這個挺有意思的就做了一下,雖然是和虛擬實境沾邊的東西,但說不定以後在資料探勘上也能用來給資料在不同屬性上分類什麼的。做了個最簡單的 模擬聲音在理想二維空間中的反射,而且假設二維空間是封閉的矩形區域,其中可能有若干的垂直或者水平的牆,將空間分割為若干的子空間,空間中有乙個聲源和乙個接收點。聲源向四...