问题如标题所示。 我试图弄清楚是否有找到峰值元素的方法 在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个元素。
答案 0 :(得分:3)
链接PDF中给出的第二个算法是O(n)。 A"窗口"被定义为统一为当前子方块的边界(即所有四个外边缘),中间列和中间行。以下是该算法的摘要:
如幻灯片中所述,时间复杂度由 T(n)= T(n / 2)+ cn ( T(n / 2)定义term是由于每个递归步骤的边长减半; cn 项是在当前窗口中找到最大值所需的时间。因此,复杂性是O(n)。
此算法的正确性基于其中一张幻灯片中列出的几个观察结果:
如果输入象限,则它包含整个数组的峰值
这基本上是对同一个1D参数的推广。只有在包含大于边框上所有元素的元素时才输入象限。所以,要么这个元素将成为一个高峰,要么你可以继续攀登"直到你在象限的某个地方找到一个峰值。
窗口的最大元素永远不会随着我们在递归中下降而减少
递归中的下一个窗口总是包含当前窗口的最大元素,所以这是真的。
访问象限中的峰值也是整个数组中的峰值
这是从峰值的定义得出的,因为它只取决于直接邻居。