具有复杂度O(n)的二维阵列中的峰值发现算法

时间:2018-06-01 19:59:33

标签: algorithm divide-and-conquer

问题如标题所示。 我试图弄清楚是否有找到峰值元素的方法 在O(n)时间内的2d阵列,其中n是2d阵列中每一侧的长度,即 n ^ 2总元素。

根据定义,2-d阵列中的“峰值”是使得>>的元素 所有邻居(即上,下,左,右槽中的元素)。

我在阅读课程笔记: http://courses.csail.mit.edu/6.006/spring11/lectures/lec02.pdf 并且理解如何在O(nlogn)中做,但似乎并不完全 掌握如何处理O(n)。

有没有人能够提出或解释这个问题在O(n)中如何解决?

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

1 个答案:

答案 0 :(得分:3)

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

  1. 在当前窗口中查找最大值
  2. 如果它是一个峰值
  3. 则返还它
  4. 否则,找到该最大值的较大邻居并递归相应的象限。
  5. 如幻灯片中所述,时间复杂度由 T(n)= T(n / 2)+ cn T(n / 2)定义term是由于每个递归步骤的边长减半; cn 项是在当前窗口中找到最大值所需的时间。因此,复杂性是O(n)。

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

      

    如果输入象限,则它包含整个数组的峰值

    这基本上是对同一个1D参数的推广。只有在包含大于边框上所有元素的元素时才输入象限。所以,要么这个元素将成为一个高峰,要么你可以继续攀登"直到你在象限的某个地方找到一个峰值。

      

    窗口的最大元素永远不会随着我们在递归中下降而减少

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

      

    访问象限中的峰值也是整个数组中的峰值

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