Arrays 二维峰值查找二进制搜索
摘自mit 6.006:要在2D数组中查找峰值,如果某个数字大于其所有相邻数字,则该数字为峰值: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峰值,前提是两种情况均不成立 用一半的列数解决新问题 当您只有一列时,找到全局最大值,就完成了 我理解为什么它可能会找到一个峰值,但我认为它只会在阵列的一半(如果存在)上找到一个峰值 在这里使用二进制搜索让我感
- 选取中间柱j=m/2
- 在(i,j)处的列j上查找全局最大值
- 比较(i,j)− 1) ,(i,j),(i,j+1)
- 选择(i,j)的左列− 1) >(i,j),同样适用于右
- (i,j)为2D峰值,前提是两种情况均不成立
- 用一半的列数解决新问题
- 当您只有一列时,找到全局最大值,就完成了
证明在(不损失一般性)右上有一个峰值,考虑下面的“梯度上升”算法:
考虑一下如果(i,j)的列中有最大值,我们从(i,j)开始梯度上升,会发生什么。要么(i,j)是一个峰值(太棒了!),要么我们在相邻的一列中移动到一个更大的数字。在后一种情况下,该数字大于第j列中的最大值,因此大于第j列中的每个数字。因此,梯度上升永远不会重新进入柱体,因此它永远不会进入另一侧的柱体,这意味着所需一侧存在峰值。“如果一个数字大于其所有相邻值,则该数字为峰值”是矛盾的(如果两种情况都不成立,则i,j为2D峰值),因为后一种情况也将平台视为峰值(所有三个值相等)。它应该是“一个数字如果不小于任何一个相邻的数字,那么它就是一个峰值”吗?你是对的,我的编辑post@WesleyLim是的。@WesleyLim在最坏的情况下,我们扫描(几乎?)所有的峰值。