2D线性时间峰值发现

时间:2014-12-27 20:13:41

标签: algorithm

我正在阅读2D峰值发现问题的this O(n) solution。作者说,一个重要的细节是

  

按最大方向分开。对于方阵,这意味着   拆分方向将是交替的。

为什么这有必要?

2 个答案:

答案 0 :(得分:3)

这不是必要的。交替方向为任何阵列提供O(N)。

让我们计算一个数组M×N的比较次数。

第一次迭代给出3×M,第二次给出3×N / 2,第三次给出3×M / 4,第四次给出3×N / 8,即:

3 * (M + M/4 + M/16 + ...) + 3 * (N/2 + N/8 + N/32 + ...)

我们有两个几何系列。因为这两个系列都有共同比例1/4,我们可以计算出上限:

3 * (4 * M/3 + 2 * N/3)

原因O(const×N)= O(N)和O(M + N)= O(N),我们有O(N)算法。

如果我们总是选择垂直方向,那么算法的性能是O(logM×N)。如果M多了N,那么这个算法会更快。 F.E.如果M = 1025且N = 3,则第一算法中的比较计数与1000相当,而第二算法中的比较计数与30相当。

按最大方向拆分数组,我们得到了针对M和N的特定值的更快算法。这个算法是O(N)吗?是的,因为即使比较每个步骤的垂直和水平部分我们有3×(M + M / 2 + M / 4 + ...)+ 3×(N + N / 2 + N / 4 + ...) = 3 *(2×M + 2×N)比较,即O(M + N)= O(N)。但我们始终只选择一个方向。

答案 1 :(得分:0)

拆分较长的一侧可确保拆分的长度最多为sqrt(区域)。他本可以通过证据注意到每次通话时他的面积减半,并且他会查看大多数3平方(区域)的单元格。