求矩阵任意子矩阵中的最大元素

2024-04-27

我给出一个矩阵N x M。对于长度的子矩阵X从位置开始(a, b)我必须找到子矩阵中存在的最大元素。

我的方法:

  1. 按照问题说的做: 简单2个循环
   for(i in range(a, a + x))
   for(j in range(b, b + x)) max = max(max,A[i][j]) // N * M

提前一点:

 1. Make a segment tree for every i in range(0, N)
 2. for i in range(a, a + x) query(b, b + x)    // N * logM

有没有更好的解决方案,复杂度仅为 O(log n) ?


稀疏表算法方法 :-<O( N x M x log(N) x log(M)) , O(1)>.

预计算时间 - O( N x M x log(N) x log(M))
查询时间 - O(1)

为了理解此方法,您应该了解使用一维稀疏表算法查找 RMQ。

我们可以使用 2D 稀疏表算法来查找范围最小查询。

我们在一维领域所做的事情:-
我们预处理RMQ对于长度的子数组2^k使用动态规划。我们将保留一个数组M[0, N-1][0, logN] where M[i][j]是子数组中最小值的索引,从i。 用于计算M[i][j]我们必须在区间的前半部分和后半部分中寻找最小值。很明显,小碎片有2^(j – 1)长度,所以计算的伪代码是:-

if (A[M[i][j-1]] < A[M[i + 2^(j-1) -1][j-1]])
    M[i][j] = M[i][j-1]
else 
    M[i][j] = M[i + 2^(j-1) -1][j-1]

Here A是存储值的实际数组。一旦我们预处理了这些值,让我们展示如何使用它们来计算RMQ(i,j)。这个想法是选择两个完全覆盖区间的块[i..j]并找出它们之间的最小值。让k = [log(j - i + 1)]。用于计算RMQ(i,j)我们可以使用以下公式:-

if (A[M[i][k]] <= A[M[j - 2^k + 1][k]])
    RMQ(i, j) = A[M[i][k]]
else 
    RMQ(i , j) = A[M[j - 2^k + 1][k]]


对于二维:-
类似地,我们也可以将上述规则扩展到二维,这里我们进行预处理RMQ对于长度的子矩阵2^K, 2^L使用动态编程并保留一个数组M[0,N-1][0, M-1][0, logN][0, logM]. Where M[x][y][k][l]是子矩阵中最小值的索引,从[x , y]并且有长度2^K, 2^L分别。 计算伪代码M[x][y][k][l] is:-

M[x][y][i][j] = GetMinimum(M[x][y][i-1][j-1], M[x + (2^(i-1))][y][i-1][j-1], M[x][y+(2^(j-1))][i-1][j-1], M[x + (2^(i-1))][y+(2^(j-1))][i-1][j-1])

Here GetMinimum函数将返回提供的元素中最小元素的索引。现在我们已经预处理好了,让我们看看如何计算RMQ(x, y, x1, y1). Here [x, y]子矩阵的起点和[x1, y1]表示子矩阵的端点表示子矩阵的右下点。这里我们必须选择四个完全覆盖的子矩阵块[x, y, x1, y1]并找到其中的最小值。让k = [log(x1 - x + 1)] & l = [log(y1 - y + 1)]。用于计算RMQ(x, y, x1, y1)我们可以使用以下公式:-

RMQ(x, y, x1, y1) = GetMinimum(M[x][y][k][l], M[x1 - (2^k) + 1][y][k][l], M[x][y1 - (2^l) + 1][k][l], M[x1 - (2^k) + 1][y1 - (2^l) + 1][k][l]);


上述逻辑的伪代码:-

// remember Array 'M' store index of actual matrix 'P' so for comparing values in GetMinimum function compare the values of array 'P' not of array 'M' 
SparseMatrix(n , m){ // n , m is dimension of matrix.
    for i = 0 to 2^i <= n:
        for j = 0 to 2^j <= m:
            for x = 0 to x + 2^i -1 < n :
                for y = 0 to y + (2^j) -1 < m:
                    if i == 0 and j == 0:
                        M[x][y][i][j] = Pair(x , y) // store x, y
                    else if i == 0:
                        M[x][y][i][j] = GetMinimum(M[x][y][i][j-1], M[x][y+(2^(j-1))][i][j-1])
                    else if j == 0:
                        M[x][y][i][j] = GetMinimum(M[x][y][i-1][j], M[x+ (2^(i-1))][y][i-1][j])
                    else 
                        M[x][y][i][j] = GetMinimum(M[x][y][i-1][j-1], M[x + (2^(i-1))][y][i-1][j-1], M[x][y+(2^(j-1))][i-1][j-1], M[x + (2^(i-1))][y+(2^(j-1))][i-1][j-1]);
}
RMQ(x, y, x1, y1){
    k = log(x1 - x + 1)
    l = log(y1 - y + 1)
    ans = GetMinimum(M[x][y][k][l], M[x1 - (2^k) + 1][y][k][l], M[x][y1 - (2^l) + 1][k][l], M[x1 - (2^k) + 1][y1 - (2^l) + 1][k][l]);
    return P[ans->x][ans->y] // ans->x represent Row number stored in ans and similarly ans->y represent column stored in ans
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

求矩阵任意子矩阵中的最大元素 的相关文章

  • CSS Hex 到速记十六进制转换

    将十六进制转换为速记十六进制的正确算法是什么 例如 996633很容易被转换为 963 但如果是这样怎么办 F362C3 我的第一个猜测是我只取每种颜色的第一个值并使用它 所以 F362C3变成 F6C 但我不知道如何从数学上证明这种方法的
  • Big O 用于有限、固定大小的可能值集

    这个问题 https stackoverflow com questions 12305028 java what is the best way to find first duplicate character in a string引
  • 自动适合衣服的算法?

    想象一下 客户要求您设计一款软件 以满足一些相当粗略的规格 如下所示 1 它将面向时尚行业营销 2 用户将是 设计衣服和东西 的人 可能有一个特定的术语 但我没有想到 3 由于各种原因 能够快速制作原型设计并查看它们在模型上的外观会很有用
  • 创建横幅交换算法来轮播广告

    我正在构建广告横幅轮播脚本基于印象整个月均匀地显示广告 每次请求显示广告时都会进行计算 所以这将是即时完成的 广告应显示为一个接一个轮流播放 而不是仅显示一个广告 1000 次展示 然后显示另一个广告 1000 次展示 大多数情况下 它应该
  • 许可证密钥模式检测? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这不是真实情况 请忽略您可能认为适用的法律问题 因为它们并不适用 假设我有一组 200 个已知的有效许可证密钥 用于假设的软件许可算法
  • 关于合并排序代码中的组合步骤的困惑

    我有一个关于数组上的合并排序如何工作的问题 我理解 划分 步骤 它将输入数组划分为 1 长度的元素 然而 当谈到 合并 部分 组合步骤 时 我感到困惑 例如 给定输入 3 5 1 8 2 除法过程将产生 5 个元素 3 5 1 8 2 我只
  • 使用Redis从有限范围内生成唯一ID

    我有一些数据库项目 除了主键之外 还需要项目所属组的唯一索引 我们来调用属性nbr 以及将项目分组在一起并定义唯一范围的属性nbr 我们会打电话group This nbr必须在 1 N 范围内 并且may从外部源导入项目时进行设置 由于所
  • 如何在从左到右、从上到下排序的二维数组中搜索数字?

    我最近收到了这个面试问题 我很好奇有什么好的解决方案 假设我有一个二维数组 其中所有 数组中的数字在增加 从左到右 从上到下的顺序 底部 搜索和搜索的最佳方式是什么 判断目标号码是否在 大批 现在 我的第一个倾向是使用二分搜索 因为我的数据
  • 比较周期性数据的快速方法

    假设我有任意类型的数据集 A B C D 并且我想将其与另一个数据集进行比较 我希望 A B C D B C D A C D A B 和 D A B C 的比较成立 但是不适用于 A C B D 或任何其他未类似排序的集合 有什么快速方法可
  • 如何在代码生成过程中简化包含变量的 C 风格算术表达式?

    我正在尝试优化编译器中的表达式求值 算术表达式都是C风格的 并且它们可以包含变量 我希望尽可能简化表达 例如 3 100 A B 100 3 100可以简化为409 300 A B 主要取决于分配律 结合律和交换律 我遇到的主要困难是如何将
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 修改排列算法以防止重复打印输出的策略

    我一直在审查实践算法 目前正在研究一种我非常喜欢的排列算法 void permute char set int begin int end int range end begin if range 1 cout lt lt set lt l
  • 二进制字符串到十进制字符串

    下午好 如何将字符数多于语言最大整数类型中位数的二进制字符串转换为十进制字符串 换句话说 假设你有字符串 111001101001110100100 1001001111011100100 并且您不能先将其转换为整数 那么您将如何以 10
  • C# 计算LRC(纵向冗余检查)

    我一直在到处研究这个问题 所有 LRC 实现似乎都没有给我正确的答案 花了几天时间后 我决定将我的代码放在这里 看看其他人是否可以发现问题 这是代码 C Input Data 31303030315E315E31303030325E315E
  • 给定与总和匹配的长度的唯一 3 位数字 (-1,0,1) 序列的数量

    假设您有一个长度为 n 即空格数 的垂直游戏板 你有一个三面骰子 有以下选项 前进一 停留和后退 如果您低于或高于棋盘游戏空间的数量 则该游戏无效 一旦到达棋盘末端 唯一有效的动作就是 停留 给定确切的骰子投掷次数 t 是否可以通过算法计算
  • 给定两个(大)点集,我如何有效地找到彼此最接近的点对?

    我需要解决一个计算问题 该问题归结为搜索两个集合之间最接近的点对 问题是这样的 给定欧几里德空间中的一组点 A 和一组点 B 找到所有对 a b 使得 b 是 B 中与 a 最近的点 a 是 A 中与 b 最近的点 集合 A 和 B 的大小
  • 当目标是查找某个字符串的所有出现情况时,KMP 最坏情况的复杂度是多少?

    我还想知道哪种算法在查找另一个字符串中所有出现的字符串时具有最坏情况的复杂性 博耶 摩尔算法似乎具有线性时间复杂度 KMP 算法在查找字符串中所有出现的模式时具有线性复杂度 如 Boyer Moore 算法1 如果您尝试在 aaaaaaaa
  • 以一定角度遍历二维数组

    通常我们按行或列遍历数组 但这里我想以角度遍历它 我会尝试解释我的意思 因此 假设角度是 45 度 那么它会搜索为 0 0 then 0 1 1 0 then 0 2 1 1 2 0 等等 抱歉 无法上传图像 因为我是新用户 不允许这样做
  • 4 x 3 锁图案

    我遇到了这个 它要求计算在 4x3 网格中可以制作特定长度的锁定图案的方式数 并遵循规则 可能有些点不能包含在路径中 有效的模式具有以下属性 图案可以使用第一次接触的点序列来表示 与绘制图案的顺序相同 从 1 1 到 2 2 的图案与图案不
  • 我想优化这个短循环

    我想优化这个简单的循环 unsigned int i while j 0 j is an unsigned int with a start value of about N 36 000 000 float sub 0 i 1 unsig

随机推荐

  • 创建 QT 应用程序作为 Windows 上现有基于控制台的应用程序的 GUI

    我正在尝试使用 Qt 为现有应用程序设置一个 GUI 该应用程序旨在在 Windows 命令行中运行 这不仅仅是运行应用程序system 命令 但我需要通过命令行与现有应用程序交互 The system 当我启动现有的可执行文件时 命令会阻
  • sql 查询不适用于 order by

    这是我原来有效的查询 Select FROM story st sentences s speaker sp WHERE st lesson id 1 AND st speaker id sp speaker id AND st sente
  • 是否有一个排序的java集合可以处理重复项?

    我需要一个行为类似于 C multimap 的集合 但我还需要能够通过一系列键获取元素 你可以看看谷歌收藏 http code google com p google collections 它有多种实现MultiMap
  • 泛型和实体框架:如何根据列值返回不同的类型

    我们有一个人员表 其中存储不同类型的人员 买方 卖方 代理人等 我们的 ORM 是实体框架 CodeFirst CTP5 我们使用存储库模式来实现良好的 TDD 和模拟 在 PersonRepository 中 我想返回特定类型 这样我就可
  • 如何为 64 位 Windows 编译现有的 posix 代码?

    我可以使用 Cygwin 或 MinGW 但我需要最终得到 64 位代码 而不是 32 位 这是因为我将从 64 位托管 C 调用 DLL 我似乎找不到关于设置这些工具来创建 64 位二进制文 件的良好参考 另外 如果 GCC 是版本 4
  • 将 jQuery 单击事件分配给正文中除少数 div 及其子元素之外的所有内容

    当我按下页面上的 div 时 会出现一个弹出窗口 当您再次单击该 div 时 弹出窗口就会消失 当您单击 div 外部时 弹出窗口就会消失 到目前为止一切看起来都很好 问题是 当我单击弹出窗口时 我希望弹出窗口及其子窗口可以单击 它们是无序
  • 在外语版本的 Excel 中从 vba 调用工作表函数

    以下代码片段在英语版本的 Excel 中运行正常 但是当尝试在葡萄牙语版本的 Excel 中的同一工作簿中运行此代码时 会出错 Add color bars on every other row attempt to make list e
  • 分面搜索的后过滤器和全局聚合之间有什么区别?

    搜索界面中的一个常见问题是您想要返回结果的选择 但可能想返回有关所有文档的信息 例如 我想查看所有红色衬衫 但想知道什么 其他颜色可供选择 这有时被称为 多面结果 或者 多面导航 这Elasticsearch 参考中的示例 https ww
  • “形式参数“foo”与多个参数匹配”-如何在 R 中处理这个问题?

    有时 调用带有某些参数的函数会导致错误消息formal argument foo matched by multiple actual arguments 是否可以打印不明确的实际参数列表 我问这个问题的原因是目前的问题plot类对象的函数
  • 使用导航控制器更改弹出窗口内容大小

    我想显示一个具有自定义内容大小的弹出窗口 我可以这样做 UINavigationController popoverContent UINavigationController alloc init UIView popoverView U
  • php 的问题:读取文件名,生成 javascript 和 html

    UPDATE 再一次问好 我发现自己遇到了一个新问题 php代码在我的PC wamp服务器 上完美运行 但我现在已将其上传到免费的网络主机服务器上 虽然php部分运行完美 它生成数组 但javascript函数本身不起作用 因为没有照片在网
  • 科尔多瓦闹钟

    我构建了一个带有计时器的 Cordova 闹钟应用程序 一切都运行良好 除了我现在想通过视觉和音频警报通知用户时钟到时 我使用了以下插件来进行本地通知 https github com katzer cordova plugin local
  • Alamofire 的响应序列化失败

    import UIKit import Alamofire import SwiftyJSON class LoginViewController UIViewController IBOutlet weak var urlTextFile
  • Visual Studio 2015 数据库项目目录包含扩展名为 jfm 的文件

    假设我们有一个数据库项目名为MyDatabase然后是一个名为MyDatabase jfm出现在项目的根目录中 当项目在 Visual Studio 中打开时 它会被独占锁定 它是一个二进制文件 它最近才开始出现 过去几天 我已经进行了谷歌
  • 合并 PDF,同时保留自定义页码(也称为页面标签)和书签

    我正在尝试自动合并多个 PDF 文件 并且有两个要求 a 现有书签和 b 需要保留页面标签 自定义页码 默认情况下 PyPDF2 和 pdftk 会在合并时保留书签 但 pdfrw 不会 PyPDF2 pdftk 或 pdfrw 中始终不保
  • 无法在Mac上安装qwt设计器插件

    我无法在 Mac 上安装 qwt 设计器插件 我已经下载了 v 6 1 3 并成功完成了 qmake make 和 sudo make install 问题是 在 usr local qwt 6 1 3 lib 下 我只有文件 qwt fr
  • 为什么同步上下文不适用于等待?

    这个答案 https stackoverflow com a 21839382 2631076 says 默认情况下 await 运算符将捕获当前 上下文 并使用它来恢复异步方法 我正在我的控制台应用程序中尝试此代码 static void
  • 初学者寻找漂亮且有指导性的 Python 代码 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 作为一个没有编程经验的初学者 我正在努力寻找漂亮的 Python 代码来学习和使用 请通过指向网站 书
  • 如何在应用程序启动时预加载 XAML?

    我有相当大的用户控件 它没有显示在主屏幕上 但用户几乎总是在以后使用它 第一次加载需要一些时间 解析 BAML 等 然后其他实例的构建速度相当快 问题是如何使其在启动屏幕期间在应用程序启动时预加载 我的想法是在启动时构建 usused 实例
  • 求矩阵任意子矩阵中的最大元素

    我给出一个矩阵N x M 对于长度的子矩阵X从位置开始 a b 我必须找到子矩阵中存在的最大元素 我的方法 按照问题说的做 简单2个循环 for i in range a a x for j in range b b x max max m