algorithm - 对二维数组进行二分搜索以找到局部最大值?这个算法有什么问题?

标签 algorithm data-structures binary-search discrete-mathematics

这是在矩阵中寻找局部最大值(只有一个)的经典方法。

我的算法是:

  • 选择矩阵中心的数字。
  • 检查该数字是否为峰值。如果是,则返回。
  • 如果没有,请检查左侧和右侧的数字。如果其中一个大于我们当前的数字,则选择矩阵的一半。如果两者都更大,我们可以选择其中一半。

  • 重复顶部和底部的数字。这将为我们留下矩阵的一个象限来继续检查。

由于这是对具有 n^2 个元素的 n x n 矩阵的二分搜索,因此应该需要 O(log(n^2)) = O(2*log(n)) = O(log(n))

我很确定这是不正确的,但是我的错误在哪里?

最佳答案

该算法不能保证找到局部最大值。例如,考虑这样一种情况,您需要沿着一条蜿蜒的路径穿过上升值矩阵才能到达峰值。如果该路径在象限之间来回交叉,您的算法将找不到它。

13  1  1  1  1
12  1  1  1  1
11  1  1  2  3
10  1  1  1  4
 9  8  7  6  5

或者,这是一个更简单的示例:

3  1  1  1  1
1  1  1  1  1
1  1  1  1  1
1  1  1  1  1
1  1  1  1  1

从中间开始,如何找到“3”?您的算法没有描述面对水平面时该怎么做。

关于algorithm - 对二维数组进行二分搜索以找到局部最大值?这个算法有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46148628/

相关文章:

algorithm - 具有共线垂直边缘段的单调多边形三角剖分

c# - 用于读取噪声比特流的冗余算法

c++ - 关于链表节点的说明

java - 找到包含所有三角形的最小面积平行四边形

java - 查找ArrayList中最接近的元素

algorithm - Hadoop-计算单词共现(边缘情况)

arrays - 查找数组中出现频率最高的三元组

javascript - StarDict 支持 JavaScript 和 Firefox OS 应用程序

java - 卡在 java 赋值,二进制搜索算法上

c++ - 如何对 std::map 中的部分键进行二进制搜索?