問題分析
**這個題目目前對於大家會有點難度,有興趣的同學可以研究一下,這種題目才是分治的精髓所在。
前段時間 partychen 到吳涇去買東西,發現在步行街有乙個賭博遊戲,乙個商人在地面上擺放了很多的小禮品,然後準備了很多大小相同的圓環,玩家可以到商人處花 5 塊錢買乙個圓環。然後站在一根白線外使用圓環套住自己想要的禮品。圓環套住的東西就歸玩家所有。我這裡描述的不是很清楚,但是我相信大家肯定也知道這個是什麼遊戲了。
出於商人的本性,他現在想邀請計算機的你,幫助他設計乙個圓環,使得這個圓環最多只能套住乙個小禮品。
為了讓問題簡單化,我們假設每乙個小禮品都是平面上的乙個點。如果點在圓環上也算套住。當然如果兩個禮品重疊放置的話 那麼圓環的半徑顯然會是 0。
他只要你求出這個圓環的半徑。
輸入資料有多組,每組測試資料第一行有乙個正整數 n (2≤n≤100000), 表示平面上有多少個點。然後有 n 組實數對 (x,y) (−1000≤x,y≤1000) 表示點的座標。如果 n=0 表示輸出結束,並且不作處理。
對於每組測試資料,輸出圓環的半徑,結果保留兩位小數。每個輸出佔一行。
所求的圓環最小半徑實際上是給定點集的最近距離的一半,因此只要遍歷點集計算所有點對之間的距離,找到最小距離即可。假設有n個點,如果挨個計算所有點對之間的距離,則需要的時間為 θ(n*(n-1)/2) 。如果採用分治策略,將點集分為左半部分 (l,mid) 和右半部分 (mid+1,r) ,分別計算出兩部分的最近點對距離 minl 和 minr,再找到分別從左半部分和右半部分各取乙個點組成的點對的最近距離min,最近點對距離就是這三個值中的最小值。這種情況下,t(n) = 2*t(n/2)+n^2/4 = … = 2n+1/2n^2。(欸欸欸?變多了?…先不管吧)
double min_dist
(int l, int r)
} min =
sqrt
(min)
; min = min>minl ? minl : min;
min = min>minr ? minr : min;
return min;
}
演算法分析與設計 最近點對問題
問題描述 最近對問題要求在包含有n個點的集合s中,找出距離最近的兩個點。設 p1 x1,y1 p2 x2,y2 pn xn,yn 是平面的n個點。嚴格地將,最近點對可能不止一對,此例輸出一對即可。基本演算法思想 暴力法 在蠻力法實現最近點對問題中,將問題簡化 距離最近的點對可能多於一對,找出一對即可...
演算法分析與設計5最近點對
在含有n個點的集合p中找出最近的兩個點的距離 採取分治策略,利用遞迴將問題反覆拆分為兩個子集,再對每個子集分別進行計算分析,然後合併比較得出最近點對間的距離 if n 2 mid high low 2 dist1 closestpoint p,low,mid dist2 closestpoint p...
演算法設計與分析之最近對問題
設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 進一步掌握遞迴演算法的設計思想以及遞迴程式的除錯技術 2 理解這樣乙個觀點 分治與遞迴經常同時應用在演算法設計之中。1 分別用蠻力法和分治法求解最近對問題 2 分析演算法的時...