分而治之以找到二维数组中两个有序元素之间的最大差异

Posted

技术标签:

【中文标题】分而治之以找到二维数组中两个有序元素之间的最大差异【英文标题】:Divide and Conquer to find maximum difference between two ordered elements in a two dimensional array 【发布时间】:2018-03-10 21:09:42 【问题描述】:

我现在使用分治算法来找到两个有序元素之间的最大差异(这意味着 A[i][j] - A[k][l] where k>i and l>j)在两个维度数组,如下图:

[ 0, 3, 6, 4]

[9,3,1,6]

[ 7, 8, 5, 6]

[1、2、3、4]

所以结果是 A[1][2] - A[0][0] = 8 - 0 = 8(不是 A[0][1] - A[0][0] = 9 - 0 = 9.

最多的问题是在一维数组中,如下问题:

Divide and Conquer Algo to find maximum difference between two ordered elements

那么如何通过分治算法在二维数组中求解呢?

非常感谢!

【问题讨论】:

你能更好地解释一下你用来到达8 - 0 = 8 以获得最终答案的算法吗?我不清楚。 这就是我问这个问题的原因。我不知道如何使用分治算法得到最终答案。 我现在明白了,8 是您当前的错误结果。这些数组是否以任何方式排序? 很抱歉我写的格式可能会误导您。我写的例子不是4个数组,是一个4*4的二维数组。我的问题是给定 n*n 二维数组 A,如何找到最大值 A[i][j] - A[k][l] 其中 k>i 和 l>j。 【参考方案1】:

有一个直接的O(n^2) 解决方案。为了计算A[i][j] − A[k][l] 的最大值,我们现在修复A[k][l]。假设在下图中A[k][l] = x。那么A[i][j]的候选集就是阴影矩形。

所以为了使A[i][j] − x最大。我们需要知道阴影区域的最大值,这可以通过简单的动态规划来计算。

+------+------+------+-----+
|      |      |      |     |
|      |      |      |     |
|      |      |      |     |
+--------------------------+
|      |      |      |     |
|      |  x   |      |     |
|      |      |      |     |
+--------------------------+
|      |      |------------|
|      |      |------------|
|      |      |------------|
+--------------------------|
|      |      |------------|
|      |      |------------|
|      |      |------------|
+------+-------------------+

定义

area(i, j) = A[x][y] | x > i, y > j f(i, j) = max( area(i, j) ) g(m, n) = max f(i, j) - A[i][j] | 1 <= i <= m, 1 <= j <= n

那么对于m*n 矩阵,我们想要的是f(m, n)

还有f(i, j) = max f(i+1, j), f(i, j+1), A[i][j]

所以 2 个 for 循环应该可以完成这项工作。

【讨论】:

以上是关于分而治之以找到二维数组中两个有序元素之间的最大差异的主要内容,如果未能解决你的问题,请参考以下文章

ArrayIndexOutOfBoundsException,同时找到数组中两个连续元素之间的最大差异

分而治之 - 在包含唯一元素的两个大小相等的数组之间找到中位数?

java 找出数组中两个元素之间的最大差异,以便较小的元素出现在较大的元素之前

在 nxn 的二维数组中查找局部最大值

UDF中两个数组之间的最大差异

如何使用分而治之以及如果一个子阵列占多数,组合阵列占多数以找到多数元素的事实?