一、对称矩阵压缩存储(分两种场景,必考)
前提定义
n 阶对称矩阵 A,满足 A[i][j]=A[j][i],只存下三角(含对角线),一维数组下标分两种:
- 数组从
S[0]开始(C 语言默认 0 基) - 数组从
S[1]开始(软考题目常用 1 基,两张图都是 1 基)
场景 1:题目条件:存下三角,S[1]=A[0][0],求 i≥j(下三角元素)
前 i 行总元素数:1+2+...+i=2i(i+1) 本行偏移:j+1(1 基) 总下标:
k=2i(i+1)+j+1 对应选择题选项C
场景 2:题目求 i≤j(上三角元素,利用对称 A[i][j]=A[j][i])
把行列互换,代入上面公式,i,j 换成 j,i:
k=2j(j+1)+i+1 对应第一张图正确答案B
场景 3:C 语言标准 0 基(数组 S [0] 存 A [0][0],i≥j)
k=2i(i+1)+j
对称矩阵 C 语言压缩代码(0 基)
#include <stdio.h> #define N 4 // 对称矩阵压缩存储 下三角 int main() { int A[N][N] = { {1,2,3,4}, {2,5,6,7}, {3,6,8,9}, {4,7,9,10} }; // 下三角元素总数 n(n+1)/2 int S[N*(N+1)/2]; int k = 0; // 存储下三角 i>=j for(int i=0; i<N; i++){ for(int j=0; j<=i; j++){ S[k++] = A[i][j]; } } // 读取任意A[i][j] int getVal(int i, int j){ if(i >= j) return S[i*(i+1)/2 + j]; else return S[j*(j+1)/2 + i]; } printf("A[0][3] = %d", getVal(0,3)); // 输出4 return 0; }二、三对角矩阵压缩存储(软考高频,第二张图)
矩阵规律
三对角矩阵只有三条对角线有非 0 元素:
- 第 1 行:2 个元素 (a1,1,a1,2)
- 第 2~n-1 行:每行 3 个元素
- 第 n 行:2 个元素 总元素数量:3n−2
1 基下标公式(题目条件:M[1]=a1,1,行号 i、列号 i,j 从 1 开始)
- 前 i−1 行总元素:
- i=1:2 个
- i>1:前 i-1 行 = 2+3∗(i−2)=3i−4
- 当前行偏移:j−(i−1)+1=j−i+2
- 合并化简最终公式:
k=2i+j−2 对应第二张图正确答案D
快速验证(套公式)
- a1,1:2∗1+1−2=1 → M[1],符合题干
- a1,2:2∗1+2−2=2 → M[2]
- a2,1:2∗2+1−2=3,a2,2=4,a2,3=5,完全匹配逐行存储顺序
C 语言 0 基版本(数组 M [0] 存 a11)
k=2i+j−3
三对角矩阵 C 语言压缩代码
#include <stdio.h> #define N 4 // n阶三对角矩阵 1基逻辑,数组0基存储 int main() { // 4阶三对角矩阵,行i:1~4,列j:1~4 int A[N+1][N+1] = { {0,0,0,0,0}, {0,1,2,0,0}, {0,3,4,5,0}, {0,0,6,7,8}, {0,0,0,9,10} }; int M[3*N-2]; // 总元素3n-2 int pos = 0; // 按行压缩存入一维数组 for(int i=1; i<=N; i++){ // 每行有效列范围 j=i-1, i, i+1 且1<=j<=N for(int j=i-1; j<=i+1; j++){ if(j>=1 && j<=N){ M[pos++] = A[i][j]; } } } // 根据i,j(1基)获取压缩下标 0基数组 int getM(int i, int j){ return 2*i + j - 3; } printf("a2,3 压缩下标:%d,值:%d", getM(2,3), M[getM(2,3)]); return 0; }三、软考速记公式汇总(直接背)
1. 对称矩阵(一维数组 1 基 S [1]=A [0][0])
- 下三角 i≥j:k=2i(i+1)+j+1
- 上三角 i≤j(对称转换):k=2j(j+1)+i+1
2. 对称矩阵(C 语言 0 基 S [0]=A [0][0])
- i≥j:k=2i(i+1)+j
- i<j:k=2j(j+1)+i
3. 三对角矩阵(题目 1 基 M [1]=a₁₁)
有效元素 ai,j 满足 ∣i−j∣≤1,压缩下标:
k=2i+j−2
4. 三对角矩阵(C 语言 0 基)
k=2i+j−3
四、做题万能技巧
- 代入特殊值验证:把 i=0,j=0 /i=1,j=1 代入选项,快速排除错误答案 例:第一张题 i=0,j=0,代入 B 选项 20∗(0+1)+0+1=1,刚好 S [1]=A [0][0],直接锁定 B
- 看清下标基准:软考选择题绝大多数是 1 基一维数组,C 代码写题默认 0 基,两套公式不要混用
- 对称矩阵看到 i≤j 立刻交换 i、j 代入下三角公式,三对角矩阵每行只有 2/3 个有效元素,公式直接记 2i+j 相关
人人皆为创造者,共创方能共成长
每个人都是使用者,也是创造者;是数字世界的消费者,更是价值的生产者与分享者。在智能时代的浪潮里,单打独斗的发展模式早已落幕,唯有开放连接、创意共创、利益共享,才能让个体价值汇聚成生态合力,让技术与创意双向奔赴,实现平台与伙伴的快速成长、共赢致远。
原创永久分成,共赴星辰大海
原创创意共创、永久收益分成,是东方仙盟始终坚守的核心理念。我们坚信,每一份原创智慧都值得被尊重与回馈,以永久分成锚定共创初心,让创意者长期享有价值红利,携手万千伙伴向着科技星辰大海笃定前行,拥抱硅基 生命与数字智能交融的未来,共筑跨越时代的数字文明共同体。
东方仙盟:拥抱知识开源,共筑数字新生态
在全球化与数字化浪潮中,东方仙盟始终秉持开放协作、知识共享的理念,积极拥抱开源技术与开放标准。我们相信,唯有打破技术壁垒、汇聚全球智慧,才能真正推动行业的可持续发展。
开源赋能中小商户:通过将前端异常检测、跨系统数据互联等核心能力开源化,东方仙盟为全球中小商户提供了低成本、高可靠的技术解决方案,让更多商家能够平等享受数字转型的红利。
共建行业标准:我们积极参与国际技术社区,与全球开发者、合作伙伴共同制定开放协议 与技术规范,推动跨境零售、文旅、餐饮等多业态的系统互联互通,构建更加公平、高效的数字生态。
知识普惠,共促发展:通过开源社区 、技术文档与培训体系,东方仙盟致力于将前沿技术转化为可落地的行业实践,赋能全球合作伙伴,共同培育创新人才,推动数字经济 的普惠式增长
阿雪技术观
在科技发展浪潮中,我们不妨积极投身技术共享。不满足于做受益者,更要主动担当贡献者 。无论是分享代码、撰写技术博客,还是参与开源项目 维护改进,每一个微小举动都可能蕴含推动技术进步的巨大能量。东方仙盟是汇聚力量的天地,我们携手在此探索硅基 生命,为科技进步添砖加瓦。
Hey folks, in this wild tech - driven world, why not dive headfirst into the whole tech - sharing scene? Don't just be the one reaping all the benefits; step up and be a contributor too. Whether you're tossing out your code snippets , hammering out some tech blogs, or getting your hands dirty with maintaining and sprucing up open - source projects, every little thing you do might just end up being a massive force that pushes tech forward. And guess what? The Eastern FairyAlliance is this awesome place where we all come together. We're gonna team up and explore the whole silicon - based life thing, and in the process, we'll be fueling the growth of technology