当前位置: 首页 > news >正文

数据结构:下三角矩阵(Lower Triangular Matrix)

目录

什么是下三角矩阵?

我们要存哪些元素?一共几个?

推导索引映射公式 

核心问题:给定 (i,j),如何计算 k?


什么是下三角矩阵?

一个 n × n 的矩阵,如果它在主对角线以上的所有元素都是 0,那么它就是一个下三角矩阵。

比如 4×4 的矩阵:

[ a00  0    0    0  ]
[ a10 a11   0    0  ]
[ a20 a21  a22   0  ]
[ a30 a31  a32  a33 ]

我们发现:

  • 只有 行号 ≥ 列号(即 i ≥ j)的位置有非零元素。

  • 其他地方(即 i < j)全是 0,不需要存!

一个矩阵 A 是一个二维的数字表格。对于一个 n×n 的矩阵来说:

  • 它一共有 n 行,每行 n 个元素。

  • 每个元素用两个下标表示:A[i][j],其中 i 是行号,j 是列号。

在 C 或 C++ 中我们常写成:A[i][j]

我们要存哪些元素?一共几个?

我们只存矩阵下三角区域的元素(含对角线),也就是:

  • 第1行:只存1个元素(A₁₁)

  • 第2行:存2个元素(A₂₁,A₂₂)

  • 第3行:存3个元素(A₃₁,A₃₂,A₃₃)

  • ...

  • 第n行:存n个元素(Aₙ₁,...,Aₙₙ)

所以总共要存的元素个数是:1 + 2 + 3 + ... + n = n * (n + 1) / 2 个元素

推导索引映射公式 

假设我们用一维数组 a[k] 来存下三角矩阵的非零值,用行主顺序(row-major order)存储

设矩阵是 n × n,下标从 1开始,那么我们就要构造一个下标转换公式:

你给我 i, j(i ≥ j),我要算出它在数组 a[] 里的位置

我们按行来存:先存第1行,再第2行,再第3行……

例子(n=4)中,存储顺序是:

a[0] = A[1][1]  
a[1] = A[2][1]  
a[2] = A[2][2]  
a[3] = A[3][1]  
a[4] = A[3][2]  
a[5] = A[3][3]  
...

核心问题:给定 (i,j),如何计算 k?

我们想要的 k 是:

第1行:有 1 个元素(j 从 1 到 1)  

第2行:有 2 个元素(j 从 1 到 2)  
...  
第(i-1)行:有 (i - 1) 个元素  

=> 总共 (1 + 2 + ... + (i-1)) = (i-1) * i / 2 个元素

加上当前这一行中第 j 个元素(从左往右第 j 个)

所以:  k = 前 (i - 1) 行的元素个数 + 第 j 列在当前行中的偏移量(j - 1)

✅ 最终公式:k = (i - 1) * i / 2 + (j - 1)

注意:这里的 k 是数组 a[k] 中的下标(从0开始)

⚠️ 重要说明

  • 这个公式只适用于 i ≥ j(也就是下三角部分)

  • 如果你输入了 i < j,就说明这个元素是 0,不在数组中!

 列主顺序存储:(这里不再详细说明)

  示例验证

矩阵如下(n=4):

1 0 0 0  
2 3 0 0  
4 5 6 0  
7 8 9 10

我们来看 A[4][2] 是多少:

  • i = 4, j = 2

  • index = (4 - 1) * 4 / 2 + (2 - 1) = 3 * 4 / 2 + 1 = 6 + 1 = 7

  • a[7] = A[4][2] = 8 

http://www.lryc.cn/news/602281.html

相关文章:

  • MySQL SQL性能优化与慢查询分析实战指南:新手DBA成长之路
  • Eigen 中矩阵的拼接(Concatenation)与 分块(Block Access)操作使用详解和示例演示
  • 简明量子态密度矩阵理论知识点总结
  • 搜索二维矩阵Ⅱ C++
  • 【LeetCode】算法详解#10 ---搜索二维矩阵II
  • 秩为1的矩阵的特征和性质
  • 青少年编程高阶课程介绍
  • 青少年编程中阶课
  • 『 C++ 入门到放弃 』- 哈希表
  • 攻防世界-引导-Web_php_unserialize
  • 《LeetCode 热题 100》整整 100 题量大管饱题解套餐 中
  • cacti的RCE
  • 关于“PromptPilot” 之3 -Prompt构造器核心专项能力:任务调度
  • keepalived原理及实战部署
  • MBR和GPT分区的区别
  • 电商项目DevOps一体化运维实战
  • 【Datawhale夏令营】端侧Agent开发实践
  • CodeBuddy的安装教程
  • JAVA东郊到家按摩服务同款同城家政服务按摩私教茶艺师服务系统小程序+公众号+APP+H5
  • 基于BEKK-GARCH模型的参数估计、最大似然估计以及参数标准误估计的MATLAB实现
  • openlayer根据不同的状态显示不同的图层颜色
  • Fortran实现 3维反距离加权(IDW)插值算法
  • 初识 docker [下] 项目部署
  • ETH 交易流程深度技术详解
  • 二、Linux文本处理与文件操作核心命令
  • 从0开始学习R语言--Day60--EM插补法
  • git stash apply 冲突合并方法解决
  • Kafka 3.9.1的KRaft模式部署
  • linux系统----Ansible中的playbook简单应用
  • 从零开始的云计算生活——第三十七天,跬步千里,ansible之playbook