You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

n阶方阵的子方阵数量公式、定义及行列式求解技术问询

关于n×n矩阵子方阵的疑问与优化解法

我来帮你梳理清楚这几个问题,一步步来:

一、子方阵的判定标准

子方阵的核心要求是连续选取行和列:从原n×n矩阵中,挑选一段连续的k行(比如第i行到第i+k-1行,其中1≤i≤n−k+1),再挑选一段连续的k列(第j列到第j+k-1列,1≤j≤n−k+1),这些行和列的交叉元素组成的k×k方阵就是原矩阵的一个子方阵。

举个例子:3×3矩阵中,第2-3行、第1-2列的交叉元素组成的2×2方阵是合法子方阵,但如果选第1、3行和第1、3列组成的2×2方阵,就不属于子方阵(因为行和列都不连续)。

二、子方阵的总数计算

你的猜想是对的,平方和公式完全适用!推导过程很直观:

  • 对于k阶子方阵(k从1到n),横向可选的连续行段数量是n−k+1(比如k=1时,有n个单独行;k=2时,有n−1个连续两行的段,以此类推),纵向可选的连续列段数量也是n−k+1
  • 因此k阶子方阵的总数是(n−k+1)²
  • 把所有k从1到n的数量加起来,就得到总数量:
    $$S(n) = \sum_{k=1}^n (n−k+1)^2 = \sum_{m=1}^n m^2 = \frac{n(n+1)(2n+1)}{6}$$
    这里只是把变量替换成m = n−k+1,本质就是前n个正整数的平方和,所以公式完全正确。

三、计算所有子方阵行列式的优化方法

逐个计算的方法虽然可行,但当n较大时(比如n≥20),时间复杂度会达到O(n⁴),效率很低。这里有几个更优的思路:

1. 利用LU分解预处理

先对原矩阵做LU分解,将M分解为下三角矩阵L和上三角矩阵U(M=LU)。对于任意子方阵M',对应的L'(L的对应子块)和U'(U的对应子块)满足M'=L'U'。

  • 下三角矩阵的行列式等于其对角线元素的乘积,上三角同理。
  • 我们可以预先计算L和U中所有连续行/列段的对角线元素乘积(用前缀积数组预处理),之后每个子方阵的行列式只需取对应L'和U'的对角线乘积相乘即可,总时间复杂度可以降到O(n³)(LU分解是O(n³),预处理和查询都是O(n²))。

2. 动态规划递推计算

定义dp[k][i][j]表示以(i,j)为右下角的k阶子方阵的行列式,我们可以利用行列式的展开定理递推:

  • 当k=1时,dp[1][i][j] = M[i][j](1阶行列式就是元素本身)。
  • 当k>1时,将k阶行列式按最后一行展开,每个元素的代数余子式就是对应的(k-1)阶子方阵的行列式乘以符号,这样可以直接利用已计算的dp[k-1][...]值来推导dp[k][i][j],避免重复计算。这种方法的时间复杂度也是O(n³),空间可以优化为O(n²)(因为计算k阶时只需要k-1阶的数据)。

3. 滑动窗口优化低阶行列式

对于2阶、3阶这类小阶数的子方阵,可以用滑动窗口的方式快速计算:

  • 比如2阶行列式,横向滑动窗口时,新窗口和前一个窗口共享一行元素,只需替换其中一列的元素,利用行列式的线性性质快速更新结果,不用重新计算整个行列式。

内容的提问来源于stack exchange,提问作者Red Book 1

火山引擎 最新活动