没有合适的资源?快使用搜索试试~ 我知道了~
首页数据结构课程设计:用分治法算法解平面最近点对问题
资源详情
资源评论
资源推荐

《数据结构》课程设计
题 目:
用分治法算法解平面最近点对问题
姓 名
:
班
级:
学 号:
时 间:

一.问题的描述
给定平面上 n 个点,找其中的一对点,使得在 n 个点组成的所有点对中,该
点对间的距离最小。
二.算法设计思想
这个问题显然满足分治法的第一个和第二个适用条件,我们考虑将所给的平
面上 n 个点的集合 S 分成 2 个子集 S
1
和 S
2
,每个子集中约有 n/2 个点,·然后在
每个子集中递归地求其最接近的点对。在这里,一个关键的问题是如何实现分
治法中的合并步骤,即由 S
1
和 S
2
的最接近点对,如何求得原集合 S 中的最接近
点对,因为 S
1
和 S
2
的最接近点对未必就是 S 的最接近点对。如果组成 S 的最接
近点对的 2 个点都在 S
1
中或都在 S
2
中,则问题很容易解决。但是,如果这 2 个
点分别在 S
1
和 S
2
中,则对于 S
1
中任一点 p,S
2
中最多只有 n/2 个点与它构成最
接近点对的候选者,仍需做 n
2
/4 次计算和比较才能确定 S 的最接近点对。因此,

依此思路,合并步骤耗时为 O(n
2
)。整个算法所需计算时间 T(n)应满足:
T(n)=2T(n/2)+O(n
2
)
它的解为 T(n)=O(n
2
),即与合并步骤的耗时同阶,显示不出比用穷举的方法
好。从解递归方程的套用公式法,我们看到问题出在合并步骤耗时太多。这启
发我们把注意力放在合并步骤上。
为了使问题易于理解和分析,我们先来考虑一维的情形。此时 S 中的 n 个点
退化为 x 轴上的 n 个实数 x
1
,x
2
,..,x
n
。最接近点对即为这 n 个实数中相差最小的 2
个实数。我们显然可以先将 x
1
,x
2
,..,x
n
排好序,然后,用一次线性扫描就可以找
出最接近点对。这种方法主要计算时间花在排序上,因此如在排序算法中所证
明的,耗时为 O(nlogn)。然而这种方法无法直接推广到二维的情形。因此,对
这种一维的简单情形,我们还是尝试用分治法来求解,并希望能推广到二维的
情形。
假设我们用 x 轴上某个点 m 将 S 划分为 2 个子集 S
1
和 S
2
,使得 S
1
={x S|∈
x≤m};S
2
={x S|x>m}∈ 。这样一来,对于所有 p S∈
1
和 q S∈
2
有 p<q。
递归地在 S
1
和 S
2
上找出其最接近点对{p
1
,p
2
}和{q
1
,q
2
},并设 δ=min{|p
1
-p
2
|,|
q
1
-q
2
|},S 中的最接近点对或者是{p
1
,p
2
},或者是{q
1
,q
2
},或者是某个{p
3
,q
3
},
其中 p
3
S∈
1
且 q
3
S∈
2
。如图 1 所示。
剩余10页未读,继续阅读
















安全验证
文档复制为VIP权益,开通VIP直接复制

评论0