0

0

优化二维最大子矩阵和问题:包含左上角单元格的快速求解方法

霞舞

霞舞

发布时间:2025-10-24 13:10:01

|

835人浏览过

|

来源于php中文网

原创

优化二维最大子矩阵和问题:包含左上角单元格的快速求解方法

本文探讨了二维最大子矩阵和问题的一个简化版本:查找必须包含矩阵左上角单元格的最大和子矩阵。针对这一特定场景,我们介绍了一种基于积分图像(Summed Area Table)的O(nm)时间复杂度的解决方案,显著优于传统O(nm^2)的Kadane算法扩展,并详细说明了如何构建积分图像以及如何从中高效地找出最优子矩阵及其和。

引言:简化版二维最大子矩阵和问题

二维最大子矩阵和问题是一个经典的算法挑战,旨在在一个给定整数矩阵中找到一个子矩阵,使其所有元素之和最大。通常,这个问题可以通过将Kadane算法(一维最大子数组和算法)扩展到二维,实现O(nm^2)或O(n^2m)的时间复杂度。然而,当问题被简化为只考虑那些必须包含矩阵左上角单元格(0,0)的子矩阵时,存在一种更为高效的O(nm)解决方案。这种简化限制使得我们能够利用积分图像(Integral Image),也称为求和面积表(Summed Area Table),来快速解决问题。

积分图像(Integral Image)原理

积分图像是一种数据结构,用于快速计算图像或矩阵中任意矩形区域的和。对于一个给定的 n x m 矩阵 M,其对应的积分图像 II 的每个单元格 II[r][c] 存储的是从原始矩阵的左上角 (0,0) 到当前单元格 (r,c) 所形成的矩形区域内所有元素的和。

积分图像的构建遵循以下递推关系: II[r][c] = M[r][c] + II[r-1][c] + II[r][c-1] - II[r-1][c-1]

其中,对于边界情况:

  • II[0][0] = M[0][0]
  • II[r][0] = M[r][0] + II[r-1][0] (对于 r > 0)
  • II[0][c] = M[0][c] + II[0][c-1] (对于 c > 0)

通过这个公式,我们可以在O(nm)的时间复杂度内构建整个积分图像。

LLaMA-Factory Online
LLaMA-Factory Online

在线大模型训练与微调服务平台

下载

针对简化问题的解决方案

由于我们只关心那些包含原始矩阵左上角 (0,0) 的子矩阵,这意味着任何这样的子矩阵都可以由其右下角 (r,c) 唯一确定。根据积分图像的定义,II[r][c] 正好表示了从 (0,0) 到 (r,c) 这个矩形区域内的元素和。

因此,解决简化版问题的核心思路是:

  1. 构建原始矩阵的积分图像。
  2. 在构建完成的积分图像中,找到最大的值。这个最大值就是我们所求的最大子矩阵和。
  3. 该最大值对应的坐标 (r_max, c_max) 即为最优子矩阵的右下角坐标。

算法步骤

  1. 初始化: 创建一个与原始矩阵 M 大小相同的 II 矩阵,并用零填充。
  2. 计算第一行和第一列:
    • II[0][0] = M[0][0]
    • 对于 c 从 1 到 m-1:II[0][c] = II[0][c-1] + M[0][c]
    • 对于 r 从 1 到 n-1:II[r][0] = II[r-1][0] + M[r][0]
  3. 计算其余部分:
    • 对于 r 从 1 到 n-1:
      • 对于 c 从 1 到 m-1: II[r][c] = M[r][c] + II[r-1][c] + II[r][c-1] - II[r-1][c-1]
  4. 查找最大值:
    • 初始化 max_sum = -infinity 和 max_coords = (0,0)。
    • 遍历整个 II 矩阵,更新 max_sum 和 max_coords。
    • 对于每个 II[r][c]:
      • 如果 II[r][c] > max_sum,则 max_sum = II[r][c] 且 max_coords = (r,c)。
  5. 结果: max_sum 是最大子矩阵和,max_coords 是该子矩阵的右下角坐标。最优子矩阵即为 M[0:max_coords[0]+1][0:max_coords[1]+1]。

示例代码 (Python)

import math

def max_submatrix_top_left(matrix):
    """
    查找必须包含左上角(0,0)的最大和子矩阵。

    Args:
        matrix: 一个n x m的整数矩阵。

    Returns:
        tuple: (最大和, (右下角行索引, 右下角列索引))
    """
    if not matrix or not matrix[0]:
        return 0, (-1, -1)

    n_rows = len(matrix)
    n_cols = len(matrix[0])

    # 1. 初始化积分图像 (Integral Image)
    ii = [[0] * n_cols for _ in range(n_rows)]

    # 初始化最大和及其对应的右下角坐标
    max_sum = -math.inf
    max_coords = (-1, -1)

    # 2. 计算第一行和第一列的积分图像
    ii[0][0] = matrix[0][0]
    if ii[0][0] > max_sum:
        max_sum = ii[0][0]
        max_coords = (0, 0)

    for c in range(1, n_cols):
        ii[0][c] = ii[0][c-1] + matrix[0][c]
        if ii[0][c] > max_sum:
            max_sum = ii[0][c]
            max_coords = (0, c)

    for r in range(1, n_rows):
        ii[r][0] = ii[r-1][0] + matrix[r][0]
        if ii[r][0] > max_sum:
            max_sum = ii[r][0]
            max_coords = (r, 0)

    # 3. 计算其余部分的积分图像并同时寻找最大和
    for r in range(1, n_rows):
        for c in range(1, n_cols):
            ii[r][c] = matrix[r][c] + ii[r-1][c] + ii[r][c-1] - ii[r-1][c-1]
            if ii[r][c] > max_sum:
                max_sum = ii[r][c]
                max_coords = (r, c)

    return max_sum, max_coords

# 示例用法
matrix1 = [
    [1,  2, -1],
    [-3, 4,  5],
    [6, -7,  8]
]
max_sum1, coords1 = max_submatrix_top_left(matrix1)
print(f"矩阵1: {matrix1}")
print(f"最大和子矩阵 (包含左上角) 的和: {max_sum1}, 右下角坐标: {coords1}")
# 对应的子矩阵为 matrix1[0:coords1[0]+1][0:coords1[1]+1]

matrix2 = [
    [-1, -2, -3],
    [-4, -5, -6],
    [-7, -8, -9]
]
max_sum2, coords2 = max_submatrix_top_left(matrix2)
print(f"\n矩阵2: {matrix2}")
print(f"最大和子矩阵 (包含左上角) 的和: {max_sum2}, 右下角坐标: {coords2}")

matrix3 = [
    [1, 1, 1],
    [1, -10, 1],
    [1, 1, 1]
]
max_sum3, coords3 = max_submatrix_top_left(matrix3)
print(f"\n矩阵3: {matrix3}")
print(f"最大和子矩阵 (包含左上角) 的和: {max_sum3}, 右下角坐标: {coords3}")

时间复杂度分析

  • 构建积分图像:
    • 初始化 ii 矩阵需要 O(nm) 时间。
    • 计算第一行和第一列需要 O(n + m) 时间。
    • 计算 ii 矩阵的其余部分需要 O(nm) 时间(每个单元格执行常数次操作)。
  • 查找最大值: 遍历整个 ii 矩阵需要 O(nm) 时间。

因此,整个算法的总时间复杂度为 O(nm) + O(n + m) + O(nm) + O(nm) = O(nm)。这相比于一般二维最大子矩阵和问题的 O(nm^2) 或 O(n^2m) 解决方案,在 n 和 m 较大时具有显著的性能优势。

总结

当二维最大子矩阵和问题被限定为必须包含矩阵左上角 (0,0) 时,积分图像提供了一种极其高效的解决方案。通过 O(nm) 的时间复杂度构建积分图像,并随后在 O(nm) 时间内找到最大值,我们可以快速确定最大和子矩阵及其右下角坐标。这种方法充分利用了问题简化带来的结构性优势,是处理此类特定约束问题的理想选择。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

537

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

17

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

25

2026.01.06

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

407

2023.08.14

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

131

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

7

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.3万人学习

Django 教程
Django 教程

共28课时 | 3.5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号