k > 1
,则最坏情况下的性能将是O(n^2)
。k
个顶峰时,我们的算法只有在确信要找到的顶峰不到k
个时才能终止。我将证明(如下)只有进行了O(n^2)
个相邻元素之间的比较,我们才能确定有< k
个顶峰。k
个峰值等价于知道我们至少有n^2-k+1
个非峰值,这就需要我们进行至少n^2-k+1
次比较,这是O(n^2)
。对于k > 1
,存在具有<k
个峰值的输入,因此在最坏情况下,我们将不得不执行这些O(n^2)
次比较才能停止搜索。k = 1
的情况,这个问题不存在,因为每个输入都保证至少有一个峰值。当我们找到第一个山峰时就可以停止搜索,因此我们不必检查是否还有更多的山峰。k
个峰值,会怎么样呢? @myrtclecat - SecularisticSlothNxN
矩阵A
。最初,A [i] [j] = i+j
。只有一个峰值。找到它很容易,但您正在尽快找到两个峰值。问题是,您被一个恶意的恶魔观察着,该恶魔可以更改您尚未访问过的单个元素的值。显然,您不能快速找到第二个峰值,因为恶魔了解您的动作。 3 * N
,从而将其变为新峰值,然后再次运行算法。它必须返回与之前相同的答案,但现在答案是错误的。 M <N ^ 2 元素。 WLOG我们可以假设当提供仅具有一个峰值的输入时,该算法将访问所有元素(如果没有,则我们始终可以修改它以这样做而不失去其处理具有两个峰值的输入的能力,例如,在访问M次后切换到暴力搜索)。将其呈现给 A [i] [j] = i+j
矩阵。该算法将访问所有元素。请注意最后访问的元素,并将其更改为峰值(如果最后一个元素是峰值,则将倒数第二个访问的元素也更改为峰值)。再次运行算法。现在输入具有两个峰值,但是算法仍然需要访问所有元素才能找到它们。
我怀疑自己漏掉了些东西,因为对于我来说,“是”的答案似乎很明显。使用给定的算法找到一个峰值,但不要在找到后停止。相反,回溯;继续寻找,直到您找到 k
个峰值,或者您耗尽了您的分治算法。
在某些病态情况下——例如,有几个起点导致已知的峰值——您可以通过排列搜索顺序来提高性能。当您回溯树并横向移动时,请不要移动到相邻位置。相反,请移动到最远的未搜索节点。您可以使用一个 O(1) 距离函数来找到它,或者只需抓取一个足够远的节点(给出搜索树层级的子矩阵大小的极好估计)。
我的脑海中正在构思一个包含 k
个不同峰值的矩阵,但这种方法解决起来不太合理。二维迷宫设计的连通性提供了很多好的工具——这等效于从给定起点找到迷宫路径。