- 问题
最近对问题
[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)] - 解析
[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
3. 设计
2: 分治法。
与合并(归并)排序类似。
分解: 先把所有点按x 升序排序。 再取mid = (l+r) /2;
解决: 左右(返回d1,d2)两边分别递归下去,直到 1 或 2 可以直接返回值。 我们 取 mi = min(d1,d2);
表示当前最小的距离。
合并: 对于分开的两个区间,可能会存在着最短距离的两个点分别在分开的左右两边。所以我们要特殊处理这种情况。
我们按当前 l - r 的区间里面的点 按 y 升序排序(在这里我们可以运用归并排序的一部分进行合并)。以我们划分的点的x为中心线,把这个区间里面的点x轴距离中线小于m的加入到S里面。
接下来枚举每一个点,再枚举其它的任意一个点。算出距离(第二层循环证明它是小于等于6的)
证明如下,假设当前我们得到了这样一个区间,且当前处理的是这个点,则我们可以把它当作圆心,画出半径为d的圆,同时右边也可以画出一个矩形分成6个小矩形,这6个小矩形每个里面最多只会出现一个点(考虑两个点在一个小矩形的对角线处,长度也为5/6d,不会满足我们递归返回的最小值d),因为是按y从小到大排序,只会处理当前圆心点上方的点,下面画出极端情况后,一边就会有3个点需要遍历,左边也一样,所以左右边遍历点数最大为6。
[核心伪代码]
4. 分析
复杂度为O(nlogn)
[算法复杂度推导]
5. 源码
https://github.com/lizi196/suan_fa_fen_xi
[github源码地址]