题目如下:
用分治法求解下面的问题
输入:
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中的所有点之间的距离至少为currentMinD