复杂度为 O(n) 的二维数组中的寻峰算法

Peak finding algorithm in 2d-array with complexity O(n)

问题如题。 我想弄清楚是否有一种方法可以找到峰值元素 O(n) 时间内的二维数组,其中 n 是二维数组中每条边的长度,即 n^2 个元素。

根据定义,二维数组中的 "peak" 是这样的元素 >= 到它的所有邻居(即上、下、左和右插槽中的元素)。

我在以下位置阅读了课程笔记: http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf 并理解如何在 O(nlogn) 中做,但似乎不太 掌握如何做 O(n).

谁能想出或解释一下如何在 O(n) 中解决这个问题?

编辑:n 是数组每一边的长度,即总共有 n^2 个元素。

链接的 PDF 中给出的第二种算法是 O(n)。 A "window" 定义为当前子方块的边界(即所有四个外边)、中间列和中间行。以下是该算法的摘要:

  1. 在当前中找到最大值window
  2. Return如果它是一个峰值
  3. 否则,找到这个最大值的较大邻居,并在相应的象限中递归。

如幻灯片中所述,时间复杂度定义为 T(n) = T(n/2) + cnT (n/2)项是由于边长在每次递归时减半;cn项是在当前求最大值所需要的时间window)。因此,复杂度为 O(n)。

此算法的正确性基于其中一张幻灯片上列出的几个观察结果:

If you enter a quadrant, it contains a peak of the overall array

这基本上是同一一维论证的概括。只有当象限包含的元素大于边界上的所有元素时,您才进入象限。因此,要么该元素将成为峰值,要么您可以保持 "climbing up" 直到在象限中的某处找到峰值。

Maximum element of window never decreases as we descend in recursion

递归中的下一个window总是包含当前window的最大元素,所以这是真的。

Peak in visited quadrant is also peak in overall array

这是根据峰值的定义得出的,因为它仅取决于直接邻居。