c++分治法求最大最小值实现_离散矩阵中的局部最小值

de233465a197990b9512bd9053ac8ed2.png

来源

这个问题的来源是 Stanford 的算法课作业

Let
be a square
grid of integers. A local minimum of
is 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 in
time (you can assume that all integers are distinct).

题目首先定义了局部最小值的概念“比其四相邻的格子(如果存在的话)中的数都要小的位置“。现在期望你能够在

时间内找到任意一个局部最小值。

解法

正统的解法

考虑通过分治的方法来定位局部最小值,即我们把在"一个

的矩阵中找任意一个局部最小值问题"定义为“
问题”,企图将其分治为"
问题"。

我们通过一个矩阵中最中间的行和最中间的列,将矩阵划分成四个部分,考虑是否能够确定在某一部分中一定存在局部最小解,如果能够确定,那么我们可以仅在该子矩阵中继续执行分治。

  • 【定义1】我们定义查找最小值为四条边界和最中间列最中间行所在包括所有元素中最小元素。即对于
    矩阵中,我们将第
    行所有元素、第
    列所有元素、第
    行所有元素、第
    列所有元素、第
    行所有元素、第
    列所有元素中的最小元素称为
    查找最小值

我们可以发现如果查找最小值的周围均被包含在上述查询范围内(四条边界和最中间列最中间行所在包括所有元素),那么这个查找最小值就是一个局部最小值。

否则,我们通过查找最小值向其周围四个方向中最小的数移动一个位置,一定会进入上述的四个子矩阵之一。

  • 【定义2】我们定义查找最小子矩阵查找最小值向其周围四个方向中最小的数移动一个位置所进入的子矩阵。如果不能移动,那么当前位置就是局部最小值,我们不定义这样的情况。
  • 【定理1】查找最小子矩阵中一定存在局部最小值。
    • 证明
      • 如果查找最小子矩阵中最小元素在边界上(即包含于上述查询范围内),那么刚才所述的移动一步不存在,因为他比移动到的位置更小,这是矛盾的;
      • 如果查找最小子矩阵中最小元素不在边界上,那么显然它能够满足其比四周的四个元素都要小,即满足存在局部最小值。

于是我们得到了一种解法:四条边界和最中间列最中间行所在包括所有元素中最小元素,判断其是否为局部最小值,如果不是则向其周围最小数移动一步,进入子矩阵,继续重复此问题,直到矩阵较小,可以直接得到答案。

int 

这种解法的正确性已经在上面的证明中得到了保证,我们考虑这种解法的时间复杂度,显然首次需要询问

个位置,而之后每一次子矩阵中均只需要询问中间行和中间列的元素(因为其周围的边界在上一次询问中已经完成,可以重复使用询问结果),所以询问次数的上限是
,即使用此方法解决问题的时间复杂度是

随机做法

我们期望找到一个比较小的位置,然后通过不断的走向四周中最小值的位置,快速的找到局部最小值。

首先可以知道,从任意一个位置出发,每次走向四个方向中最小元素所在的位置,一定可以走到一个局部最小值,只不过移动的步数可以达到

,例如可以冲矩阵中间位置出发,通过回字形绕圈。

为了方便起见,我们将矩阵中的元素认为是一个

的排列。
  • 【定理2】在一个包含
    排列的
    矩阵中每次随机查询一个位置,找到一个元素满足
    的期望次数是
    的。
    • 证明
      • 表示恰好随机
        次,找到一个元素满足
        的概率
      • 于是有

于是我们得到了另一种解法:随机

次取最小值作为起点,每次走向四个方向中最小元素所在的位置,直到走到局部最小值。

这种做法我个人认为要比前一种做法更加精妙,当然这种做法的时间复杂度保证前提是确定了矩阵再进行查找,在特殊的情况下,博弈对抗你的询问,即前

次一次从大到小给出数的情况,是没有办法得到期望效果的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值