来源
这个问题的来源是 Stanford 的算法课作业
Letbe a squaregrid of integers. A local minimum ofis an element that is smaller than all of its neighbors (diagonals do not count). For example, in the grid, some of the local minima are,. Design a recursive algorithm to find a local minimum intime (you can assume that all integers are distinct).
题目首先定义了局部最小值的概念“比其四相邻的格子(如果存在的话)中的数都要小的位置“。现在期望你能够在
解法
正统的解法
考虑通过分治的方法来定位局部最小值,即我们把在"一个
我们通过一个矩阵中最中间的行和最中间的列,将矩阵划分成四个部分,考虑是否能够确定在某一部分中一定存在局部最小解,如果能够确定,那么我们可以仅在该子矩阵中继续执行分治。
- 【定义1】我们定义查找最小值为四条边界和最中间列最中间行所在包括所有元素中最小元素。即对于
矩阵中,我们将第行所有元素、第列所有元素、第行所有元素、第列所有元素、第行所有元素、第列所有元素中的最小元素称为查找最小值。
我们可以发现如果查找最小值的周围均被包含在上述查询范围内(四条边界和最中间列最中间行所在包括所有元素),那么这个查找最小值就是一个局部最小值。
否则,我们通过查找最小值向其周围四个方向中最小的数移动一个位置,一定会进入上述的四个子矩阵之一。
- 【定义2】我们定义查找最小子矩阵为查找最小值向其周围四个方向中最小的数移动一个位置所进入的子矩阵。如果不能移动,那么当前位置就是局部最小值,我们不定义这样的情况。
- 【定理1】查找最小子矩阵中一定存在局部最小值。
- 证明
- 如果查找最小子矩阵中最小元素在边界上(即包含于上述查询范围内),那么刚才所述的移动一步不存在,因为他比移动到的位置更小,这是矛盾的;
- 如果查找最小子矩阵中最小元素不在边界上,那么显然它能够满足其比四周的四个元素都要小,即满足存在局部最小值。
- 证明
于是我们得到了一种解法:四条边界和最中间列最中间行所在包括所有元素中最小元素,判断其是否为局部最小值,如果不是则向其周围最小数移动一步,进入子矩阵,继续重复此问题,直到矩阵较小,可以直接得到答案。
int
这种解法的正确性已经在上面的证明中得到了保证,我们考虑这种解法的时间复杂度,显然首次需要询问
随机做法
我们期望找到一个比较小的位置,然后通过不断的走向四周中最小值的位置,快速的找到局部最小值。
首先可以知道,从任意一个位置出发,每次走向四个方向中最小元素所在的位置,一定可以走到一个局部最小值,只不过移动的步数可以达到
为了方便起见,我们将矩阵中的元素认为是一个
- 【定理2】在一个包含
排列的矩阵中每次随机查询一个位置,找到一个元素满足的期望次数是的。
- 证明
- 令
表示恰好随机次,找到一个元素满足的概率
-
- 于是有
-
- 即
- 令
- 证明
于是我们得到了另一种解法:随机
这种做法我个人认为要比前一种做法更加精妙,当然这种做法的时间复杂度保证前提是确定了矩阵再进行查找,在特殊的情况下,博弈对抗你的询问,即前