使用积分图像(二维前缀和)高效解决包含左上角单元格的二维最大子矩阵和问题


使用积分图像(二维前缀和)高效解决包含左上角单元格的二维最大子矩阵和问题

本文详细阐述了如何利用积分图像(二维前缀和)技术,以o(nm)时间复杂度高效解决一个特定版本的二维最大子矩阵和问题。该问题要求子矩阵必须包含原始矩阵的左上角单元格。通过预计算累积和,积分图像允许我们以常数时间获取任意此类子矩阵的和,从而简化了最大和子矩阵的查找过程,并能同时确定其边界。

引言:特定二维最大子矩阵和问题

在计算机科学和算法领域,二维最大子矩阵和问题是一个经典难题。其通用版本旨在从一个给定的 n x m 整数矩阵中找出和值最大的子矩阵。通常,这个问题可以通过将二维问题降维为一维最大子数组和问题(利用 Kadane 算法)来解决,其时间复杂度为 O(nm^2) 或 O(n^2m)。

然而,本文将聚焦于该问题的一个简化版本:我们只考虑那些必须包含原始矩阵左上角单元格 (0,0) 的子矩阵。对于这种特定约束,我们是否能找到一个更高效的 O(nm) 解决方案,并且不仅能得到最大和,还能确定该子矩阵的具体边界?答案是肯定的,利用积分图像(或称二维前缀和)技术可以实现这一目标。

积分图像(二维前缀和)原理

积分图像(Integral Image),也称为二维前缀和(2D Prefix Sum)或求和面积表(Summed Area Table, SAT),是一种用于快速计算矩阵任意矩形区域和的预处理技术。

核心思想: 一个积分图像 ii[r][c] 存储的是原始矩阵中从 (0,0) 到 (r,c) 矩形区域内所有元素的累积和。

计算公式: 对于原始矩阵 matrix,其积分图像 ii 的计算公式如下: ii[r][c] = matrix[r][c] + ii[r-1][c] + ii[r][c-1] - ii[r-1][c-1]

在应用此公式时,需要处理边界条件:当 r 或 c 为 -1 时,对应的 ii 值为 0。例如,ii[-1][c] 和 ii[r][-1] 都被视为 0。

这个公式的直观理解是:

  • matrix[r][c]:当前单元格的值。
  • ii[r-1][c]:上方矩形区域 (0,0) 到 (r-1,c) 的和。
  • ii[r][c-1]:左方矩形区域 (0,0) 到 (r,c-1) 的和。
  • ii[r-1][c-1]:左上方重叠区域 (0,0) 到 (r-1,c-1) 的和。

通过 ii[r-1][c] + ii[r][c-1],我们实际上将 ii[r-1][c-1] 区域的值重复加了一次,因此需要减去一次以获得正确的累积和。

AI建筑知识问答 AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 172 查看详情 AI建筑知识问答

算法实现:查找最大和子矩阵

对于本问题,由于子矩阵必须包含 (0,0),这意味着任何此类子矩阵的左上角都是 (0,0),而右下角是 (r,c)。根据积分图像的定义,ii[r][c] 的值恰好就是从 (0,0) 到 (r,c) 这个子矩阵的和。因此,我们只需要构建完整的积分图像,然后遍历 ii 矩阵,找出其中的最大值,该最大值即为所求的最大子矩阵和。同时,记录下这个最大值对应的 (r,c) 坐标,即可确定最优子矩阵的右下角。

具体步骤:

  1. 初始化积分图像: 创建一个与原始矩阵 matrix 大小相同的 integral_image 矩阵,并用 0 填充。
  2. 计算积分图像: 遍历原始矩阵的每一个单元格 (r,c)。
    • 对于 (0,0) 单元格,integral_image[0][0] = matrix[0][0]。
    • 对于第一行 (0,c) (c > 0),integral_image[0][c] = matrix[0][c] + integral_image[0][c-1]。
    • 对于第一列 (r,0) (r > 0),integral_image[r][0] = matrix[r][0] + integral_image[r-1][0]。
    • 对于其他单元格 (r,c) (r > 0, c > 0),应用公式: integral_image[r][c] = matrix[r][c] + integral_image[r-1][c] + integral_image[r][c-1] - integral_image[r-1][c-1]。
  3. 查找最大和及边界: 在计算 integral_image[r][c] 的同时,维护一个 max_sum 变量来记录当前找到的最大子矩阵和,以及 max_br_row 和 max_br_col 来记录该最大和对应的右下角行和列索引。
  4. 确定最优子矩阵: max_sum 即为最终结果。由于子矩阵必须包含 (0,0),其左上角固定为 (0,0),右下角为 (max_br_row, max_br_col)。

示例代码

以下 Python 代码演示了如何使用积分图像技术解决此问题:

import math

def find_max_submatrix_from_top_left(matrix):
    """
    查找包含左上角(0,0)单元格的最大和子矩阵。
    使用积分图像(二维前缀和)技术。

    Args:
        matrix (list[list[int]]): 输入的n x m整数矩阵。

    Returns:
        tuple: (max_sum, top_left_row, top_left_col, bottom_right_row, bottom_right_col)
               其中 top_left_row/col 总是 0, 0。
               如果矩阵为空,返回 (0, 0, 0, -1, -1)。
    """
    if not matrix or not matrix[0]:
        return 0, 0, 0, -1, -1

    nrows = len(matrix)
    ncols = len(matrix[0])

    # 初始化积分图像 (Summed Area Table - SAT)
    # integral_image[r][c] 存储的是原始矩阵从 (0,0) 到 (r,c) 的和
    integral_image = [[0] * ncols for _ in range(nrows)]

    max_sum = -math.inf # 初始化为负无穷大,以处理全负数矩阵的情况
    max_br_row = 0      # 记录最大和子矩阵的右下角行索引
    max_br_col = 0      # 记录最大和子矩阵的右下角列索引

    for r in range(nrows):
        for c in range(ncols):
            # 获取当前单元格的值
            current_val = matrix[r][c]

            # 获取上方、左方和左上方对角线的值(处理边界为0)
            val_above = integral_image[r-1][c] if r > 0 else 0
            val_left = integral_image[r][c-1] if c > 0 else 0
            val_diag_above_left = integral_image[r-1][c-1] if r > 0 and c > 0 else 0

            # 计算当前单元格的积分图像值
            integral_image[r][c] = current_val + val_above + val_left - val_diag_above_left

            # 更新最大和及对应的右下角坐标
            if integral_image[r][c] > max_sum:
                max_sum = integral_image[r][c]
                max_br_row = r
                max_br_col = c

    # 因为子矩阵必须包含左上角(0,0),所以左上角坐标固定
    top_left_row = 0
    top_left_col = 0

    return max_sum, top_left_row, top_left_col, max_br_row, max_br_col

# 示例使用
matrix_example = [
    [1, 2, -1],
    [-3, 4, 5],
    [6, -7, 8]
]

max_sum, tl_r, tl_c, br_r, br_c = find_max_submatrix_from_top_left(matrix_example)

print(f"最大子矩阵和: {max_sum}")
print(f"子矩阵范围: ({tl_r}, {tl_c}) 到 ({br_r}, {br_c})")

# 提取并打印最优子矩阵
if max_sum != -math.inf: # 确保找到了一个有效子矩阵
    print("最优子矩阵:")
    for r_idx in range(tl_r, br_r + 1):
        print(matrix_example[r_idx][tl_c : br_c + 1])
else:
    print("未找到有效子矩阵(矩阵可能为空或全部为负无穷)")

复杂度分析

  • 时间复杂度:
    • 构建积分图像需要遍历 n x m 矩阵中的每一个单元格一次。每个单元格的计算都是常数时间操作(加减法)。
    • 在构建过程中,我们同时更新了最大和及其对应的右下角坐标,这同样是常数时间操作。
    • 因此,总的时间复杂度为 O(nm)。
  • 空间复杂度:
    • 需要一个与原始矩阵大小相同的 n x m 矩阵来存储积分图像。
    • 因此,空间复杂度为 O(nm)。

注意事项与总结

  1. 适用性: 积分图像方法的高效性严格依赖于“子矩阵必须包含原始矩阵的左上角 (0,0)”这一特定约束。对于任意位置的二维最大子矩阵和问题,此方法不适用,仍需使用 Kadane 算法的二维扩展或其他更复杂的算法。
  2. 效率提升: 相较于通用二维最大子矩阵和问题的 O(nm^2) 或 O(n^2m) 复杂度,积分图像方法将时间复杂度显著降低至 O(nm),实现了线性时间求解。
  3. 应用领域: 积分图像不仅在此类特定求和问题中表现出色,在图像处理领域也有广泛应用,例如快速计算图像区域的平均值、标准差,以及在Haar特征检测中用于加速特征计算等。

通过本文的讲解,我们深入理解了如何利用积分图像(二维前缀和)这一强大的预处理技术,以最优的 O(nm) 时间复杂度高效解决特定约束下的二维最大子矩阵和问题,并能够准确地定位到最优子矩阵的边界。

以上就是使用积分图像(二维前缀和)高效解决包含左上角单元格的二维最大子矩阵和问题的详细内容,更多请关注其它相关文章!


# 计算机  # 浮点  # 这一  # 知识问答  # 都是  # 的是  # 此类  # 遍历  # 最优  # 大和  # 单元格  # python  # 对比的网站建设  # 小周seo优化  # 会员网站推广分析  # 高新网站优化专业报价  # 杭州网站推广巍信hfqjwl下拉  # 金融组织网站建设流程  # 北京商城网站建设  # 网站建设开发售后  # 黑龙江免费关键词排名  # 公司网站在百度里推广 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: 搜狗浏览器如何查找页面中的文字 搜狗浏览器Ctrl+F页面搜索功能  鲁班大师乓乓皮肤获取方法  以下哪一个是适应长期护理制度发展而设立的新职业  《淘宝联盟》推广自己的店铺方法  Flexbox布局实践:实现底部页脚与顶部粘性导航条的完美结合  PHP utf8_encode 字符编码转换疑难解析与最佳实践  苹果17 Pro如何启用分屏浏览_iPhone 17 Pro分屏浏览设置步骤  vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足  京东快递包裹信息查询入口 京东快递官方查询平台入口  汽车之家网页版免费登录_汽车之家官网首页直接进入  如何在Golang中处理表单文件上传_Golang 表单文件上传示例  c++如何掌握指针的核心用法_c++指针入门到精通指南  PHP 4 函数中引用参数的默认值限制与解决方案  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  实时数据流中高效查找最小值与最大值  鸿蒙单条备忘录如何加密  J*aScript实现网页表单实时输入字段比较与验证教程  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  《宝可梦大集结》S4冠军之路开始时间介绍  Composer reinstall命令重装损坏的包  在VS Code中利用AI辅助进行代码迁移  哔哩哔哩的|直播|间怎么送礼物_哔哩哔哩|直播|送礼操作指南  优化CSS动画与J*aScript定时器协同:构建稳定Toast提示  Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】  解决VS Code中Python版本冲突与输出异常的指南  TikTok私信无法发送表情怎么办 TikTok消息表情发送修复方法  VB表达式书写规则解析  晓晓优选app支付宝绑定方法  在PySimpleGUI中实现键盘按键绑定按钮事件  天堂漫画网页版在线阅读 天堂漫画手机版入口  CDR如何复制交互式填充色  Retrofit根路径POST请求:@POST("/") 的应用与解析  Vue 3中独立响应式实例的创建与应用  微信网页版在线登录 微信网页版在线使用入口  《广发易淘金》国债逆回购操作教程  iPhone 13 Pro Max如何设置桌面小组件_iPhone 13 Pro Max小组件添加指南  byrutor直接访问入口 byrutor官方游戏库  《火影忍者:木叶高手》快速升级攻略  PSD转AI文件的简单方法  edge浏览器怎么修改语言为中文_Edge界面语言切换教程  优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南  windows10怎么更改下载路径_windows10默认存储位置修改教程  如何用Golang优化微服务间请求性能_Golang 微服务请求性能优化方法  行者app怎样导出日志  《糖豆》添加舞曲方法  Go语言反射机制下访问嵌入结构体中的被遮蔽方法  TikTok视频播放不流畅怎么办 TikTok视频播放优化方法  AO3中文入口稳定分享_AO3官网HTTPS看文详解  如何在vscode中关闭it环境  申通快递物流信息查询 申通快递包裹状态追踪 

 2025-10-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.