【发布时间】:2017-05-15 04:31:42
【问题描述】:
我正在尝试了解壁橱对算法如何从 n log^2 n 时间到 n log n 时间。我得到以下部分(来自http://www.cs.mcgill.ca/~cs251/ClosestPair/ClosestPairDQ.html)
- 用线 l 将集合分成大小相等的两个部分,并递归计算每个部分的最小距离。
- 令 d 为两个最小距离中的最小值。
- 消除距离 l 大于 d 的点
- 根据 y 坐标对剩余点进行排序
- 按 y 顺序扫描剩余点,并计算每个点与其五个邻居的距离。
- 如果这些距离中的任何一个小于 d,则更新 d。
步骤 4 是一种需要 O(n log n) 时间的排序,它支配所有其他步骤,这是需要减少到 O(n) 以使整个算法达到 O(n log n) 时间。这是我很难理解的部分。作者提出
第 1 步:将集合划分为...,并递归计算每个部分的距离,返回每个集合中的点以按 y 坐标排序的顺序。 步骤 4:在 O(n) 时间内将两个排序列表合并为一个排序列表。
您仍然需要在递归步骤中按 y 坐标对点进行排序,这需要 O(n log n) 时间。我们怎样才能避免这种情况?合并是 O(n),但我们仍然需要在某个地方进行排序。
【问题讨论】:
标签: algorithm sorting recursion closest-points