【发布时间】:2020-07-20 04:49:02
【问题描述】:
我是编码新手,今天我完成了二维空间中最近对问题的简单解决方案。 (2个for循环)
但是我放弃了寻找任何可以在 O(n log n) 中完成的解决方案。即使研究了它,我仍然不明白这怎么能比琐碎的方法更快。
我的理解: -> 首先,我们将数组分成两半,并仅考虑 X 坐标对所有内容进行排序。这可以在 n log n 中完成。
接下来是递归调用,在每一半中“找到距离最短的两个点”。 但是这是如何在 O(n^2) 以下完成的呢? 据我了解,如果不检查每一个点,就不可能找到 N/2 个点之间的最短距离。
有一维的解决方案对我来说绝对有意义。排序后我们知道,两个不相邻的点之间的距离不能小于至少两个相邻点的距离。然而,对于二维空间,情况并非如此,因为我们有一个额外的 Y 坐标,这可能导致在 X 轴上不相邻的两点之间的距离最小。
【问题讨论】:
-
例如,这个问题与快速排序有何不同?你有
T(n) = 2 T(n/2) + O(n)重复,这给了你时间限制。在进行任何递归调用之前,您只对点进行一次排序。 -
是的,但是是什么让递归调用比遍历数组更便宜?据我了解,我仍然必须检查每个点及其距离,而无需使用循环。如果我只检查具有相邻 X 坐标的点(可以完成 O(n)),我可能会错过非相邻(关于 X 轴)点之间可能存在的最小距离。
-
我建议你看一下算法的描述。例如,参见 sec。 33.4 在 T.H.Cormen、C.E.Leiserson、R.L.Rivest、C.Stein 中找到最近的一对点。 算法简介.
标签: algorithm time-complexity divide-and-conquer