题目如下:
用分治法求解下面的问题
输入:
P=(p(1),p(2),…,p(n))为三维空间中n个不同的点,即
P(i)=(x(i), y(i), z(i)) ,1≤i ≤n
输出:
距离最近的两点。
所有的过程与寻找二维空间中的最近点对类似(见算法导论第二版591页),只是在找Y’内的最短距离时,需要考虑的紧随其后的点的数目不同。
(1)Divide:我们按照y值的大小来分割三维空间。平面y=middleY代表将点集P分割的中间曲面,得到两个集合pL和pR;
(2)Conquer:分别对pL和pR集合求最近点对,和最近的距离,lMinDistance和rMinDistance,然后将当前的最近距离设置为lMinDistance和rMinDistance的最小值currentMinDistance=min{lMinDistance,rMinDistance};
(3)Merge:建立一个数组middleP和middleArrayY,分别代表平面y=middleY两侧y值的距离不超过currentMinDistance的范围内所有的点和所有的y值的集合。我们在middleP中找最近的点对。可以证明,对于middleP中的每一个点,仅需要检查紧随其后的15个点即可。
证明:我们可以在平面y=middleY的两侧做两个边长为currentMinDistance的正方体,分别记为L1和R1。假定在某一级递归调用中,最近的点对des1属于pL,des2属于pR,则des1和des2的距离Distance(des1,des2)一定严格小于min{lMinDistance,rMinDistance}。点des1必在平面y=middleY上,或者在平面的左侧;点des2必在平面y=middleY上,或者在平面的右侧。由此可知,des1和des2在以y=middleY为中心,两个在平面上投影重合的正方体L1和R1围城的区域θ内。
下面证明,至多有16个点位于θ内。因为L1中的所有点之间的距离至少为currentMinDistance,L1属于PL,PL之间的所有点之间的距离至少为currentMinDis

这篇博客介绍了一种用分治策略求解三维空间中点集P的最近点对的方法。首先按照y值划分点集为pL和pR,然后分别对这两个集合递归求解最近点对。在合并阶段,通过构建一个数组middleP和middleArrayY,只检查每个点后面15个点以确定最近点对,最终找到全局最近点对。算法保证了在每个步骤中,最近点对的距离不会超过之前找到的最小距离。
最低0.47元/天 解锁文章
5314

被折叠的 条评论
为什么被折叠?



