有人能解释一下为什么这个算法的递归部分有运行时
t(n)={o(1),如果n≤3;
{tf(n/2)+tc(n/2)+o(n),如果n>3。
->其中tf(n/2)表示t(n/2)的楼层功能,tc(n/2)表示天花板功能???是吗?
该算法称为Shamos,主要步骤如下:
如果n≤3,用蛮力找出最近点并停止。
找到一条垂直线V,将输入集分成两个大小不相交的子集PL和PR
尽可能平等。指向左边或线上
属于PL且点在右边或线上属于PR。由于
集合是不相交的。
递归求pl中最近点对的距离δl和最近点对的距离δr
配对公关。
设δ=min(δL,δR)输入集中一对最近点的距离P是
在递归步骤中发现的点(即δ)或由pl中的点之间的距离组成
还有公关方面的一点。
(a)从PL到PR的唯一候选点必须位于一个垂直条带中,该条带由
在v线左边距离δ处的线和在v线右边距离δ处的线
(b)让yv是按非递减y坐标排序的条带内点的数组
(即,如果i≤j,则YV[i]≤YV[j])。
(c)从YV中的第一个点开始,步进槽(最后一个除外),检查距离
这一点与接下来的7个点(或任何剩下的,如果没有那么多的7)。如果
找到距离严格小于δ的对,然后将该距离赋给δ。
返回δ。
提前谢谢你。

最佳答案

T(c(n/2))T(f(n/2))分别描述在左组和右组递归调用算法所需的时间,因为每个组中都放置了一半的点。
O(n)来自算法中的棘手部分:在递归调用之后,我们找到了δ,即左组或右组中最近的一对点之间的距离现在我们要寻找由左组的一个点和右组的一个点组成的对。当然,观察距离中线远于δ的点几乎没有用处。然而,可能所有的点都在中线的δ内,所以我们有可能不得不比较n^2点对。现在重要的观察是,正是因为我们知道,在每一组中,没有一对点比δ更接近,所以我们知道,对于左组中的每一对,我们需要从右组中寻找多少点,有一个小的、恒定的最坏情况限制。因此,如果我们只能在点的y坐标上进行排序,我们就可以在线性时间内找到最接近的点对由于列表在递归调用之间的传递方式,可以在线性时间内获得这个排序的列表,但是细节会让我无法理解(任何人都可以随意填写)。

关于algorithm - 运行时说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5109942/

10-13 08:30