分治演算法 求最小點對

2021-10-04 07:25:46 字數 1460 閱讀 7362

a.演算法設計原理

1.採用分治的策略,將問題以x的中位數劃分為左右倆個子問題分別為minleft=mindistance(pl,xl,yl),minright= mindistance(pr,xr,yr)。每個子問題求解得到的值,取較小值d= min

2.假設在第一步中找到的最小的距離為d,我們只需要再分別從左右取點p,q,得到距離與d相比較,d=min。關鍵在於證明是有限個點。推導過程如下(影象反了)

b.偽**描述:

初始化p,x,y

快速排序p(按照x),x,y,y在排序前得到對應x得位置mindistance(p,x,y)

若p中點的數目為2,3直接求解

根據最中間得下標直接劃分p,x,根據y已知對應x的下標拆分x,得到pl,xl,yl,pr,xr,yr;

求minleft= mindistance(pl,xl,yl)

minright= mindistance(pr,xr,yr)

d=min(dr,dl)

在pl距離範圍內的每個點,檢查pr中是否有點與該點的距離小於d,若有則d取新值。由於上面的拆分其實此時每個子問題y是有序的,我則從小到大檢查,每乙個點後繼的6個點即可

返回dc.關鍵問題

1.拆分點集,關鍵是讓y中的y知道當前情況下的x的位置,所以需要設計乙個特殊的資料結構來記錄。

struct pointxy

;

在x中資料排好序後,y馬上記錄下來此時x的位置

for

(int i =

1; i <= listnumber; i++

)

由於每次排好序x的x之間的位置是不變的,它只是通過中位線劃分了,所以我們只要對y中記錄的x座標做乙個相對變換就好了

void

dividxy()

else

}for

(int j =

1; j <= n; j++

)else}}

//劃分p

void

dividp

(numlist *p, numlist *pl, numlist *pr)

else

} pl-

>number = m;

pr->number = n;

}

關鍵函式

float

mindistance

(numlist *p, pointxy x[

], pointxy y)

else

if(n ==3)

else}}

}return d;

}

對p,x,y初始化,以及用快速排序排好傳參就可以輸出最小點對的距離值。

演算法分析與設計 作業5 分治法求最小點對

令p為笛卡爾積平面上n 1個點構成的集合,集合中的每個點都按照其x軸座標公升序排列。用分治法求兩點之間的最小距離。輸入 按x座標排列的n n 2 個點的集合s n 3的情況下 m是s中各點x座標的中位數 d1 計算的最近對距離 d2 計算的最近對距離 d min d1,d2 依次考察集合s中的點p ...

(模板)hdoj1007(分治求平面最小點對)

題意 給定n個點,求平面距離最小點對的距離除2。思路 分治求最小點對,對區間 l,r 遞迴求 l,mid 和 mid 1,r 的最小點對,取兩者中的小者設為d。然後處理乙個點在左區間,乙個點在右區間的情況。乙個點p在左區間,如果使它與右區間q乙個點距離小於d的話,那麼p到mid的距離一定小於的,q也...

分治演算法 求逆序對

題目 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...