【发布时间】:2019-11-23 14:01:44
【问题描述】:
我必须从给定集合中找到平面中所有最近的点对。
我已经成功实现了一个类似于这个伪代码函数的朴素算法O(n²),其中set 是输入上所有点的列表,count 是输入上所有点的计数,它返回dist是找到的最小距离,result 是具有该距离的所有点对的列表。
function naive(Points[] set, int count)
result = []
distance = INF
for i=0 to count-1:
for j=i+1 to count:
newDistance = distance(set[i], set[j])
if newDistance < distance:
result = []
result.append({set[i], set[j]})
else if newDistance == distance:
result.append({set[i], set[j]})
return (dist, result)
此解决方案效果很好,但由于O(n²) 的复杂性很高,因此对于较大的输入非常慢。我想找到一个更快、更优化的解决方案,所以我使用基于this article 的递归分治算法实现了O(n logn) 解决方案,该算法适用于大多数输入,但由于这种方法不会遍历所有它在像这样的输入上失败的点(对的顺序和对内的点顺序无关紧要):
Input:
{A[0,0], B[1,0], C[1,1] D[0,1]}
Current (wrong) output:
{A[0,0], D[0,1]}, {B[1,0], C[1,1]}
Desired output:
{A[0,0], B[0,1]}, {A[0,0], D[0,1]}, {C[1,1], B[1,0]}, {C[1,1], D[1,0]}
而且由于它是递归的,因此对于较大的输入,堆栈很容易溢出。有什么更好的方法来解决这个问题?
谢谢
【问题讨论】:
标签: algorithm recursion optimization