1.概述

在本教程中,我们将讨论在a中找到本地最小值的问题2DNXN矩阵。

首先,我们将定义问题并提供解释它的示例。

其次,我们将呈现一个天真的方法,然后改善它以获得更好的解决方案。

2.定义问题

假设我们有一个2D大小的矩阵NXN这包括NXN独特的整数。我们的任务是在给定矩阵中找到本地最小值。

回想一下,在一个地方\ textbf {2d}矩阵是具有小于所有相邻的相邻小区的值的小区。

如果它在矩阵内部,则单元格具有四个相邻的相邻单元。此外,如果它在矩阵的边界上,它有三个相邻的相邻小区。最后,如果位于矩阵的任何角落,它只有两个相邻的相邻小区。

让我们来检查一个例子以便更好地理解。假设我们有以下几个2D大小的矩阵4.X4.

正如我们所看到的,我们的示例中有三个局部最小单元:

  1. 细胞(1,1),因为它的所有两个相邻的相邻小区的值大于1
  2. 细胞(2,3),因为它的四个相邻邻居单元的所有值大于2
  3. 细胞(4,3),因为它的三个相邻邻居单元的所有值大于8.

因此,我们示例的答案可以是这三个局部最小细胞的任何单元格。

3.天真的方法

3.1。大意

这里的主要思想是始终移动到最小的相邻邻居单元,其中值小于当前单元值,直到我们达到局部最小值。

要迭代我们的矩阵,我们将使用DFS.(深度首先搜索)。每次到达单元格时,我们都会检查它是否是一个本地最低限度,这意味着我们完成了,因为我们在给定的情况下找到了一个本地最低限度2D矩阵。否则,我们将移动到具有小于当前单元值的所有相邻小区之间的最小值的小区。

最终,这必须终止,因为移动到具有小于当前小区值的值的单元格不能永远地继续。

3.2。执行

让我们来看看这样的实现:

QuickLatex.com呈现

最初,我们宣布获取\ _ next \ _ cell函数将返回小于当前单元值的值的最小相邻邻居单元。对于每个细胞,我们必须检查四个可能的相邻小区。

首先,我们会宣布Xy表示当前行的值(当前的。排)和当前列(当前的。柱子), 分别。然后我们声明价值,表示最小相邻小区的值。最初,我们将当前单元格的值分配给它。最后,我们宣布了下一个\ _ cell,这将表示最小的相邻小区。开始,它将等于当前的细胞。

接下来,我们将检查当前的行索引是否大于1,这意味着上面的一个细胞当前的一。然后,我们将检查该单元格的值是否小于我们到目前为止的最小值。如果是这样,我们将更新下一个\ _ cell等于位于位于的小区当前的细胞。我们为左侧,右侧和倒数相同的细胞进行相同的过程。

最后,我们回来了下一个\ _ cell我们将在下一个搬到DFS.遍历。

然后我们宣布了查找\ _本地\ _最小值函数,返回给定矩阵中的局部最小值。开始,我们得到了下一个\ _ cell我们将在下一个DFS呼叫中搬到。其次,我们会检查是否下一个\ _ cell等于这一点当前的细胞,这意味着当前的单元格是局部最小值,因为它没有相邻的单元,其值小于值的值当前的细胞。否则,我们搬到了下一个\ _ cell在我们的DFS遍历。

3.3。复杂

这种方法的复杂性与DFS复杂性相同,这是\ boldsymbol {o(v + e)= o(n ^ 2)}, 在哪里V.是细胞的数量和E.是过渡的数量。因此,它是o(n ^ 2)因为细胞的数量是n ^ 2.,虽然过渡的数量略低于4 n ^ 2。这种复杂性背后的原因是,我们将在最坏情况下迭代每个单元格。因此,我们遍历其邻近的邻居。总的来说,我们也遍历每次过渡一次。

分行和征服方法

4.1。大意

我们将给定矩阵划分为四个象限子矩阵。我们可以保证我们的本地最小值将在这四个子矩阵中的一个内。要查找我们当地最小值的子矩阵,我们将迭代中间\ _行中间\ _列获取具有在所有值中具有最小值的单元格中间\ _行中间\ _列

在我们获得最小值的细胞后,我们会得到下一个\ _ cell(最小的相邻小区)。现在具有的子矩阵下一个\ _ cell它也将有当地的最低限度。这是真的,因为如果局部最小值是另一个子矩阵,则意味着我们必须越过中间\ _行或者中间\ _列,而且这是不可能的,因为我们挑选了所有人之间具有最小值的细胞中间\ _行中间\ _列细胞。

让我们来看看以下例子以便更好地理解:

我们采取细胞(3,5)= 16,它在所有的中都有最小的价值中间\ _行中间\ _列细胞。然后我们得到了下一个\ _ cell它是细胞(4,5)= 15。所以我们可以保证当地的最小值将在内部左下方子矩阵。因此,我们解决了我们的问题左下方子矩阵并重复相同的过程。

4.2。执行

让我们来看看这样的实现:

QuickLatex.com呈现

最初,我们宣布查找\ _本地\ _最小值函数将占用给定矩阵并返回其中的局部最小单元格。

然后我们宣布了索引中间\ _行中间\ _列。之后,我们宣布了MIN \ _单元格,表示具有置于所有单元格中的最小值的小区中间\ _行中间\ _列。要做到这一点,我们使用获取\ _ min \ _ \ _行, 和获取\ _min \ _在\ _列中返回某个行或列中的最小值的函数。

我们会得到这一点下一个\ _ cellMIN \ _单元格正如我们在先前的方法中所做的,知道我们的本地最小值的子矩阵。

现在我们会检查一下下一个\ _ cell等于MIN \ _单元格。在这种情况下,它意味着MIN \ _单元格是一个本地最小值,所以我们在此时返回并完成算法。

但是,如果下一个\ _单元格。排小于中间\ _行,这意味着我们的本地最小值在左上角或右上右子矩阵中。因此,我们必须检查是否下一个\ _单元格。柱子小于中间\ _列,意味着我们在左上亚矩阵中具有局部最小值。否则,它将在右上右子矩阵中。

最后,我们会检查一下是否下一个\ _单元格。排大于或等于中间\ _行,这意味着我们的本地最小值在左下方或右下子矩阵中。我们以与以前的条件相同的方式检查它。

4.3。复杂

这里的复杂性是\ boldsymbol {o(n)}让我们检查这种复杂性背后的原因。

在第一个电话中,我们迭代2N细胞得到的MIN \ _单元格。但是,在第二个电话中,我们迭代\ frac {2n} {2}细胞。之后,我们迭代\ frac {2n} {4}细胞,等等。

所以迭代总数将等于\ sum ^ {n} _ {i = 1} \ frac {2n} {i} \ \大约4n这意味着复杂性是\ boldsymbol {o(n)}

结论

在本文中,我们介绍了在a中找到局部最小值的问题2D矩阵。我们解释了一般的想法并讨论了两种方法。

首先,我们解释了天真的。然后我们改进了它来获得d \&c方法,比第一个更快。

评论在本文上关闭!