Arrays 二维峰值查找二进制搜索

Arrays 二维峰值查找二进制搜索,arrays,algorithm,search,Arrays,Algorithm,Search,摘自mit 6.006:要在2D数组中查找峰值,如果某个数字大于其所有相邻数字,则该数字为峰值: 选取中间柱j=m/2 在(i,j)处的列j上查找全局最大值 比较(i,j)− 1) ,(i,j),(i,j+1) 选择(i,j)的左列− 1) >(i,j),同样适用于右 (i,j)为2D峰值,前提是两种情况均不成立 用一半的列数解决新问题 当您只有一列时,找到全局最大值,就完成了 我理解为什么它可能会找到一个峰值,但我认为它只会在阵列的一半(如果存在)上找到一个峰值 在这里使用二进制搜索让我感

摘自mit 6.006:要在2D数组中查找峰值,如果某个数字大于其所有相邻数字,则该数字为峰值:

  • 选取中间柱j=m/2
  • 在(i,j)处的列j上查找全局最大值
  • 比较(i,j)− 1) ,(i,j),(i,j+1)
  • 选择(i,j)的左列− 1) >(i,j),同样适用于右
  • (i,j)为2D峰值,前提是两种情况均不成立
  • 用一半的列数解决新问题
  • 当您只有一列时,找到全局最大值,就完成了
我理解为什么它可能会找到一个峰值,但我认为它只会在阵列的一半(如果存在)上找到一个峰值

  • 在这里使用二进制搜索让我感到困惑,因为(1)2d数组没有排序,每次减半都是在说左边没有峰值(这还没有确认?)
  • 发现中间列中的最大元素-这忽略了由非最大数形成的峰值的可能性,或者在该列
  • 中可以有一个以上的1D峰值。
  • 他们将数字与中间列max的左右两侧进行比较——这意味着左右列中可能有大于max但不相邻的元素
  • 有人能解释一下为什么这个算法是正确的吗,希望能解释一下(1)(2)(3)

    每次你减半,你基本上是在说左边不可能有峰值

    啊,不,我们是说右边有个山峰。左边也可能有峰值,但我们不需要找到每个峰值

    证明在(不损失一般性)右上有一个峰值,考虑下面的“梯度上升”算法:

  • 从任意数字开始

  • 当当前号码至少有一个较大的邻居时,转到任意较大的邻居

  • 此算法从不循环,因为当前数只会增加。该算法因此终止,因为有有限多个数字。当算法终止时,它发现了一个峰值


    考虑一下如果(i,j)的列中有最大值,我们从(i,j)开始梯度上升,会发生什么。要么(i,j)是一个峰值(太棒了!),要么我们在相邻的一列中移动到一个更大的数字。在后一种情况下,该数字大于第j列中的最大值,因此大于第j列中的每个数字。因此,梯度上升永远不会重新进入柱体,因此它永远不会进入另一侧的柱体,这意味着所需一侧存在峰值。

    “如果一个数字大于其所有相邻值,则该数字为峰值”是矛盾的(如果两种情况都不成立,则i,j为2D峰值),因为后一种情况也将平台视为峰值(所有三个值相等)。它应该是“一个数字如果不小于任何一个相邻的数字,那么它就是一个峰值”吗?你是对的,我的编辑post@WesleyLim是的。@WesleyLim在最坏的情况下,我们扫描(几乎?)所有的峰值。